perm filename PARSE.SAI[AL,HE]15 blob
sn#372605 filedate 1978-08-05 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00052 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00005 00002 UPDATES TO PARSE BY MSM
C00010 00003 the AL to S-expression translator AND MSM SWITCHES
C00015 00004 ! statement, operator, sex, require, move definitions
C00021 00005 ! brace, condition_monitor, dimension, misc reserved word definitions
C00023 00006 ! dec_name, declaration names for input and output
C00025 00007 ! operators
C00027 00008 ! reserved_words
C00030 00009 ! init_reserved
C00032 00010 ! predefined constants
C00035 00011 ! predefined macros
C00037 00012 ! compiler switches and control tables
C00040 00013 ! hash, declaration of debugging variables, start of hidden_parse
C00043 00014 ! ---- DECLARATIONS ----
C00049 00015 ! record declarations
C00055 00016 ! other declarations
C00057 00017 ! error, error_recovery, error_reject, print, file_indent
C00073 00018 ! process_switches, got_input, got_output, open_logging_file, open_new_file,check_want_copy
C00081 00019 ! push_source_list,pop_source_list,new_expr_rec
C00083 00020 ! id info processing routines
C00089 00021 ! read
C00094 00022 ! macro handling routine
C00100 00023 ! expand_macro
C00105 00024 ! get_token
C00118 00025
C00122 00026 ! check, inverse, multiply and divide dimensions ! CHECK_EXP_TYPE_DIMENS
C00127 00027 ! check_entry,insert_entry into tables
C00133 00028 ! expression evaluation routines
C00146 00029 ! P_EXP2_BASIC, OPCODE, ERROR HANDLER
C00151 00030 ! exp,bfact,bterm,aexp,term,factor
C00173 00031 ! exp2 starts here, p_exp_basic
C00174 00032 ! P_condition
C00184 00033 ! P_clauses, T_gen
C00198 00034 ! P_statement, F_state, modify_continue, modify_flush
C00203 00035 ! begin_P,end_P, open_paren_P
C00213 00036 ! for_P,case_P,do_P
C00219 00037 ! move_P,affix_P,unfix_P
C00226 00038 ! signal_p, wait_p
C00230 00039 ! dump_P
C00234 00040 ! on_P, reference_P,deproach_P
C00237 00041 ! open_P,center_P,stop_P,enable_P,disable_P
C00240 00042 ! require_P
C00247 00043 ! dimension_P
C00250 00044 ! string_P
C00252 00045 ! abort_P, note_P,comment_P,speed_factor_P,wrist_P,setbase_P
C00256 00046 ! define_P,declare_P,global_P,procedure_P,return_P
C00271 00047 ! P_statement execution starts here
C00282 00048 ! execution starts here, initialization
C00287 00049 ! set up input and output
C00291 00050 ! set up predefined dimensions, constants, macros and variables
C00294 00051 ! PARSE PROGRAM
C00296 00052 ! SWAP TO AL COMPILER
C00298 ENDMK
C⊗;
COMMENT UPDATES TO PARSE BY MSM
8- 4-78 no more I option on error
unused variables now give warning message
7-26-78 no more user comment delimiters and macro delimiters
7-13-78 WRIST,SETFORCE
6-27-78 INT DIV MOD ETC
6- 3-78 IMPLEMENTED ARRAY, PROCEDURE DECLARATIONS AND RELEVANT UPDATE TO
EXP,BFACT, case statement
DO .... UNTIL STATEMENT
5-30-78 IMPLEMENTED DEPROACH(F)←T
5-29-78 IMPLEMENTED LOG,EXP,CONSTRUCT,≡
CASE STATEMENT
5 -15-78 FIXED BUG IN CHECK_DIMENSIONS WHICH CAUSED A RECORD WITH
ALL COEFFICIENTS NON ZERO TO BE NOT TREATED AS NIL_DIMENS
COMPILER SWITCH "N" AND UNKNOWN SWITCH PASSED THROUGH AT ARG'S REQUEST
3 - 7-78 UNIQUE S-EXPRESSION IDENTIFIERS BEGINNING WITH $
3 - 4-78 EXPRESSION PARSER CHANGED, ADDED SIN, COS, ACOS, ASIN, etc
11-24-77 NONRIGIDLY DEFAULT AFFIXMENT CHANGED TO RIGIDLY
NO NULL ADDED
9-15-77 FIXED BUG THAT MAKES INV(A)*B TO (TINVRT (TTMUL A B))
BY ADDING "INV" TO PARSE_SPECIAL
6-29-77 GLOBAL BACKUP TO END OF LATEST END,BEGIN OR SEMI-COLON POSSIBLE
6- 7-77 PREDEFINED MACROS
ADJACENT MACRO BUG FIXED
6- 1-77 CODE FOR NEW FORCE STUFF
5-19-77 UNARY + AND - FINALLY WORK, SIGH
5- 3-77 STRICT DIMENSIONAL CHECKING NOW DEFAULT
3-16-77 ENABLE/DISABLE
MESSAGE END OF EACH BLOCK GIVING LIST OF VARIABLES NOT DEFINED AND
NOT USED
REMOVED PARSESHIT
1- 9-77 MORE MEANINGFUL ERROR MESSAGES
1- 9-77 CAN CORRECT MORE ERRORS
WILL NOT ACCEPT DIMENSIONS ON ANYTHING EXCEPT SCALARS AND VECTORS.
1- 5-77 ACCEPTS STRING DEFINITIONS
12-25-76 CAN CORRECT MINOR ERRORS IN SOURCE CODE IN_LINE
12-23-76 CAN ACCEPT TTY INPUT AS A FILE
12-21-76 ACCEPTS DIMENSIONS ON CONDITAON MONITORS
CREATES NEW DECLARATIONS IF UNDECLARED TERM USED IN LHS OF ASSIGNMENT
12-15-76 BAIL CAN BE CALLED IN FROM REQUIRE SWITCHES INSTRUCTIONS
DEFAULT AND ONLY ACCEPTABLE DAMENSAONS OF FRAME IS DISTANCE
TRANS SHOULD BE DIMENSIONLESS
12-14-76 NEW SETUP FOR RESERVAD WORD DEFINITIONS, ETC.
ERROR RECOV@%2jjXA]⊃≤A→∪→
A¬'↔λ↓
∨$A⊃∨&A9∨(Aa∪'(~(∩∪π∨5¬∪≥βQ∪∨≤A=A!→U&1$Y5∪≥+&a$~∀∩%π∨≠¬%≥β)∪=≤A∨↓)≠β↔∀1$XA→≠β↔
a$~∀bHZb`Z\l∪/⊃∃≤A%I∨$A∨_A≠βπI≡A/∪Q⊂A!βIβ≠)∃%&Aβ
)+β_↓!β%β5)%LA'+¬M)∪)+Qλ~∀$∪βππ∃!)&A=≥→2A⊃∪')β9π
A-∃π)∨$↓)εA9≡A ∨9∂$AYπ)∨HA ∪'Qβ≥π
4∀∩∪%∃#+∪%∀A¬β∪0Aβ ∃λ~∀bHZ@nZ\l∪≠β
%≡Aa!β≥'%∨∀A∨_A)1PA∨,hQEI5β15]XM∩⊗FVM∩∃α∞|j6⊗:!B∩⊗2Lj&R⊗∃_4)E
iEY5;0&:⊗:α∞"⊗≤Xb⊗:%∩eαεt!α&:≤*JPb,rRJe¬αJ>∞,"VJ⊗_h)EEk U5]0J&:N-∩R&>rα>→α≥"J&∞!B∩&6,pb∞",~-αN<JR∞ hP$&εdaαBJ,"⊗~&t*⊃α∞|rNRεu"Mα∩,~2εJ,!α∩&l*:Nε|r2⊗N_h)EEk Q5]0J∩&6,rN&>tb⊗NM∧"⊗∞∩
∩εRε|qα∞>-∩∞⊗⊃¬"=αRMα∃α≡2α⊗bB∀*NN&|p4($MB"εQeJ"εQeR"εQ∧jε∩∃∧"&6⊗u~&>:d*NL4S E5Yk9X$&t*]α↑
Iα>→∧~>&B-"&:≥∧"&6⊗u~&>:_h)EEk⊃5]XHJ∞"εt:∃α2∩⊗1α$yαNRlbε α|qαB≥β04)E
iI5]0H&∞"r≡⊗M¬"=α∩,~2εJ)BAαRzβπ33␈9β∪↔6W3Qε{→β∪O≠Sπ;≡)βS=ε3Kπ7/_4)E
iI5]0H&29#IαB≥β⊃Qαε$"⊗⊃α$yα≡&4)α∩&l*:Nε|qα>→∧2Jε6*αεMα$JNRεt~∀4) 5I5;0$&ε$"⊗⊃α,bN∃α$J6⎇A∧
~R⊗∩αN⊗∞|r⊃α&2αNRε$*6⊗:"αR=α≥*J¬α∃*≥α>rαB≥↓# α∩⊗≤bεJ∀E4)E
iE5]0H&↑>∀∩2¬α≤z66εt!α&6∧b⊗&⊗u"⊗⊂4S A5IJi]Xεdz≡≡&t9α~⊗
"VJ∃∧J6B∩,j⊗:R, 4)EαiI]5;0&RZ≥* αεt!αZN,⊃α&6∧b⊗&⊗u"⊗⊂4S A5EBi]Xε≤Bε:≡*αNR>αα
2V*α>IαL*22>:αR=α≥">Aα∀
J5α⎇⊃αfε∀il4(hP3∂?nk↔;Q∧εFF*λ→Bπ&t
2n/∞
&/∨=≥vrπN,⊗w≡L≡F␈∩λ→d"∧X9R¬≥y~D≤DZ70hPQ(&.>≥dα*⊂4ThTA"C!*Q05)~Q(Fε∞λ∀jJR3Qc
⊃∪∞d∧∀Q4*Y4Q(ε&
∞⊂∀h∧RING_SPACE; REQUIR@
@dβ↓Qaα≥JNR⊗iBBα⊃Xh+K↔∂+'K∃α∩nvNh∧"ε&]H
-]=→4N]FEεB∧DDDY2s4w→FE↓∧Omq2cZw(
,
λ∧ε∩{mK]I:α`4)∧Kjg∂?nk↔;Rh¬@hWL≤ Kjv⊂%AαA0v≥∧↑S@14εbX~)YL∩z≤bdX~)ML∩z≤bh@0hS∂H%j9EU0hSGCπ≤∧PKjvBα`HαY≤.]⎇→"'Tm@⊗βE9xz[z2D↑IX∧7,
rubout =≤b`≥]`h ⊗∨-H A↔4j↓f⊗αS∪@12)P~X4⊃C@7∧∧W.x;Y↓↔)m≠∧¬∃S⊂1QCgαC↔H%k→I04TCKπβ∪εF∂=WKβ( ≠∧@
`!β∪?∂↔'+K∀cF@≡F↑ ∂&⊗Kβ"M\8|[c
_<p∀→y∧↑@14∧X~∃5KieSα_c#π≤¬ε/⊂↔P&@⊗εE 2eserve`⊂⊃Q¬`∂#↔RD_CLASS],
preload_array(name, defs, type, first, len)=[
preset_with defs null; type array name[first:first+len] ];
! N.B. -- preload_array always creates an array 1 longer than requested;
! if /nB is set in the command line then assume he wants a debugging parser;
define id_type_table=0,
macro_type_table = 1,
macro_in_macro_type_table = 2,
dimension_type_table = 3 ,
array_type_table = 4,
procedure_type_table = 5;
require "<><>" delimiters;
ifc ¬declaration(debug_compile) thenc
define
decipher_debug(a)=<
assignc a=cvms(compiler!banner)[2 to ∞-1];
assignc a=cvps(a)[length(scanc(cvps(a), lf, null, "IA"))+1 for ∞];
assignc a=cvps(a)[length(scanc(cvps(a), tab, null, "IA"))+1 for ∞];
assignc a=cvps(a)[length(scanc(cvps(a), space, null, "IA"))+1 for 1];
"a">;
ifc decipher_debug()="0"
thenc define debug_compile=false;
elsec define debug_compile=true;
endc
endc
define
decipher_compiletime(a)=<
assignc a=cvms(compiler!banner)[2 to ∞-1];
assignc a=cvps(a)[length(scanc(cvps(a), tab, null, "IA"))+6 for 21];
"a">;
require unstack_delimiters;
require ifc ¬debug_compile
thenc " NON-" elsec " " endc & "DEBUGGING VERSION " message;
ifc debug_compile thenc EXTERNAL PROCEDURE BAIL;
REQUIRE "LA" ERROR_MODES; ! to compile and go home when system busy;
endc
define
indices(name, postfix)=[
redefine xxcount=0;
redefine xx(xxarg)=[
redefine xxtemp=[define xxarg] & [postfix=xxcount];
xxtemp;
redefine xxcount=xxcount+1;];
name];
! ID postfix conventions
_VALUE AL data types
_RES reserved word types
_beg reserved word group begin
_end reserved word group end
_R REDUCE action routines
_P PARSE action routines
_TOKEN scanner token types
_CM condition monitors
_X indices of various sorts
_METRIC dimensional analysis non-sense
_DIMEN how to combine various matrix operands
_TYPE to decide which table to insert into
;
! **********; require "SNAILR[AL,HE]" source_file; ! **********;
INTEGER PROCEDURE ___TIME;
BEGIN
INTEGER __T;
quick_code
setz '13, ;
calli '13,'27 ;
movem '13,__T ;
end;
RETURN(__T);
END;
! ************ MSM SWITCHES *************;
DEFINE DEFIN_PRINT_SWITCH = FALSE;
DEFINE DUP_FILE = true;
DEFINE full_set = true;
! statement, operator, sex, require, move definitions;
redefine xx(str)=[
redefine reserved_X_count=reserved_X_count+1;
redefine xx_temp="define " & "str" & "_RES=reserved_X_count";
xx_temp;];
redefine yy(str,str2)=[];
redefine zz(str)=[
redefine reserved_X_count=reserved_X_count+1;
redefine zz_temp="define " & "str" & "_RES=reserved_X_count";
zz_temp;];
define statement_definitions=[
xx(BEGIN)
yy(COBEGIN)
xx(END)
yy(COEND)
yy([;])
zz(OPEN_PAREN)
yy([(])
zz(DECLARE)
yy(SCALAR, scalar_value)
yy(VECTOR, vector_value)
yy(ROT, rot_value)
yy(FRAME, frame_value)
yy(PLANE, plane_value)
yy(TRANS, trans_value)
yy(EVENT, event_value)
yy(ATOM, atom_value)
yy(WORLD, world_value)
yy(LABEL, label_value)
! xx(GLOBAL) ;
xx(IF)
xx(PLAN)
xx(WHILE)
xx(FOR)
xx(DO)
xx(CASE)
Xx(RETURN)
xx(MOVE)
xx(AFFIX)
xx(UNFIX)
xx(SIGNAL)
xx(GAIT!
! xx(WHEN) ;
xx(DUMP)
! xx(ASSERT)
α yy(DENY) ;
xx(ON)
yy(DEFER)
!xx(REFERENCE) ;
xx(OPEN)
yy(CLOSE)
xx(CENTER)
xx(STOP)
xx(SPEED_FACTOR)
xx(DEPROACH)
xx(PROCEDURE)
xx(DEFIJE)
xx(REQUIRE)
@apQ ∪5≥'∪=≤R~∀∧∪qpQM)%∪≥≤R~∀∩AsrQ9.1'Q%∪≥∞$~∀∩@↓srQ∨1λ1')I∪≥∞Rv~∃q`Qπ∨≠5≥(R4∃qpQ¬¬∨%($~∀@AerQ!%%≥(R~(@Asr!!β+'∀R~∧@↓srQ!I∨≠!($~∃qp!≥∨)
$~∀@AerQ≥∨Q
bR~(@Asr!≥∨)
HR~∃q`Q' β'
R4∃qpQ]%∪'($~∃qp!∃β¬1
R~∃apQ ∪Mβ¬→
$~∃:v4∀~∃I∃MS]J↓←aKe¬i←d1
YCgg∃f{6~)utQπ=≠≠αR4∀@AsdQ6Y:$~∃qp!#,X%Kcl1`R~)αβge"Yru0'-XbaHh+caDzI0'␈⊂ba$hQ↓βgJBl}u`K?HbBH4)↓πKe"l5i0'c␈⊂ba$hQ↓βgJBb>I`Kc?HEA$4+GA"ε: `'π≠!Ba$4R↓βgeEX∩u0N;⊂b@H4+cBB:>Q`K;?PEA$4)αβge"X*u0'v{PbaHh+kiDzJ∩⊗⊂H4)↓πKe"mmi0'O-λba$hQ↓βgJBlnu`KO;∀EA$4 αβge"[ru0'≡;PbaHh)↓βOI"mrj`'O3!Ba$4R↓βgeEXvu0O≠∨∀bBH4)↓πKe"lei0'Of(ba$hSki"∩M$4R↓βgeE[ru0O≠πLEA$4)
βge"52ZRJrM%LhSki""⊃$4R↓βgeEY.u0Oβ3WLEA$4 αβge"Zju0'nK;WLEA$4+UQ"6Ve!$4 αβge"Zru0'6#?Pb@H4)↓πKe"mUi0'SNk↔LbBH4)↓πKe"m⎇i0'O&KXbaHh)↓βOI"6ε@`'7πACa$∀R↓βgeDj&90Nk'8cBH4)↓πKe"∩M10'∪O0ca∧hQ↓βgJB6>⊃`K7?⊂EA$4 λβge"52J>Q`K[@7-}AEB∀π0hW/%¬=∃E⊃PRα∂∨∩E=*A@O?.C¬BHQ$απO∃β∩`H∪∪¬BHQ$απO∃5ujA≡7&␈3αHh/+"D5Yh2Hh$⊂πOJ45jbA≥f}ocαKXQ$απO∃ u∀LYjB`N}-⊗.wAαHhαHλ∂∨*∃3I~ α=.l8⎇ε¬!"H∧∂>*⊂+ 4kα,∨~8 L⊗∀FE⊂λ<|T(∪iV∧x≠yL,∀CE⊂⊂<↑T$g+∧y4w≥,∀FB⊂⊂<|J$g*⊗αtw:⊗∀FE⊂λ<|T!Se)j)∃aj⊗∧Xww9z≤:qz⊗∀FE⊂λ<|T)Ti*⊗∧\xy2≡∀FE⊂λ<|T)Rg⊗∧yZw<∀CE⊂⊂<↑T!giK∧qwyF<⊂FEλ⊂<|T⊂idg, asin_x!
yy(ACOS, acos_x!
yy(ATAN∩, atan2_x)
yy(DOG, log_x!
yy(EXP, exp_X)
α! zz(SCALAR)
yy(ANGLE, angle_X);
zz(CLOSE_PAREN)
α yy([)])
];
define requIre_definiTions=[
xx(SOURCE_FILE)
xx(MESSAGE)
xx(ERROR_MODES)
xx(COMPILER_SGITCHES)
xx(BAIL)
];
define move_definitions=[
xx(VIA)
xx(WITH)
xx(APPROACH)
yy(ARRIVAL)
yy(DEPARTURE)
Xx(WOBBLE)
xx(NO_NULLING
xx(NULLING)
xx(DIRECTLY)
];
! AlL resErved wordclas@LASHOLAQCmα)β¬β∧{OS≠MAβ?→α⊂bJ⊗~⊃9↓α&C∃β≠∞≠QβSFQβSF)βCπ↔≠↔H4R↓β∨K␈+CMβ≡cπO↔~βS/∨/##↔IεK@~π,\ff.>LV"ε/∀π&FTF.6≥m↔&N⎇`ε}∩
≤B?~∞⎇↔&B∧#ε⊗.t$ε∞vAQ"αα#Vv"$∞ε␈∨Lm↔F/5dα¬&Tε≡}LTε&.\≥f'~∞Mε∂"
]↔≡→
(U~ε,TββXQ!PPH⊃⊃⊂HH⊃⊃⊗&.m≥f(h.8 /β∀Q4a⊃/+$EA"X\L≤y&∀HZb/+&∃β"[-≡xf∀HZb/,¬A"X{#
Q4b!↔,β!.Y<q..Y9εβ_{⎇-n∂,↓QC"\nL=→;,]]ε_L\b/<L↑y<]L\ε⊗ε=⎇;]¬6.c"A⊃""".>_=→-\;]εL9Z;M≡~;{N7c"B!⊃"""!⊃"9→,m;Y#!.⎇_=]9;]β9Yα'↑Y<p∩\;2r⊗1wz[:⊗εE≠x2y0]7y1→sD↑y→yry;→r,_wzw:
X]FEαDDDD[x2y0]7y1[0yyb\]FE∧BDDDDBDDr2Y4w2FB7x2y_z7y→w2∧↑\2yr`2ved_X_count,
move_beg =reserved_X_count+13
move_definitions;
define
mov@∀1K@; IwK↔≤∧W↔⊗\C¬AF=}Vw"AQ'⊗/≡X
.,&_Y,q/<Y.<αy;"Y,1[zw:∃L]FE∧BDDDy→xzty→L22s~w4z4[w9]FB∧DDDBDDDDY2s4w→FA92\zpy2F2s2∧Oy2yb\;2r⊗1wz[:∃X]CE∧DDBDl,∀∪bj)$PTDP@∃$fbVλ"$ij⊂e!bVλ2z1W∞FEεE~w24`#es(require_definitions$ _X);
indi@
KfQ[=mJ1I∃MS]Sβ#'?;~abaKX4(! brace, condition_monitor, dimension, misc reserved word definitions;
define brace_definitions=[
zz(BRACE)
yy([}])
yy([{])
];
define cm_definitions=[
zz(cm)
qq(nil)
yy(FORCE, force_cm)
yy(TORQUE, torque_cm)
yy(DURATION, duration_cm)
yy(TEMPERATURE)
yy(SQUEEZE)
];
define metric_definitions=[
zz(METRIC)
qq(nil)
yy(DISTANCE, distance_METRIC)
yy(TIME, time_METRIC)
! yy(MASS, mass_METRIC) ;
yy(ANGLE, angle_METRIC)
yy(FORCE, force_metric)
];
DEFINE MISC_DEFINITIONS=[
zz(MISC)
yy([?])
yy(ABS)
yy(TO)
yy(TRACING)
yy(WHERE)
yy(THEN)
yy(FORM)
yy(AT)
yy(BY)
yy(CHANGING)
yy(ALSO)
yy(DONT)
yy(ONLY)
yy(QUERY)
yy(RIGIDLY)
yy(NONRIGIDLY)
yy(STEP)
yy(INSCALAR)
yy(UNTIL)
yy(ELSE)
! yy(⊗) ;
];
redefine zz(str)=[];
redefine qq(str)=[
redefine qq_temp=[xx(str)];
qq_temp;];
redefine yy(str,str2)=[
redefine yy_temp=[xx(str)];
yy_temp;];
indices(metric_definitions, _METRIC);
define
metric_max =xxcount-1;
indices(cm_definitions, _CM);
EVALdefine basic_dimensions=[
redefine zz(str,str2)=[];
redefine qq(str,str2)=[];
redefine yy(str,str2)=[xx(str)];
metric_definitions
];
! dec_name, declaration names for input and output;
! don't juggle the order of these definitions, because the parse will cease to
function;
define dec_name_definitions=[
xx(SCALAR, $SVAR)
xx(VECTOR, $VVAR)
xx(ROT, $RVAR)
xx(FRAME, $FVAR)
xx(PLANE, $PVAR)
xx(TRANS, $TVAR)
xx(EVENT, $EVAR)
xx(ATOM, $ATOM)
xx(WORLD, $WVAR)
! xx(CM_LABEL, $OMNLAB)
xx(CLC_LABEL, $CLCLAB)
xx(CH_LABEL, $CHGLAB)
xx(LABEL, $STMLAB) ;
xx(LABEL, $LAB)
];
! data types;
DEFINE
string_VALUE =-2,
form_VALUE =-1,
boole_VALUE =0; ! others follow directly, but see later;
define
dec_name_count=0;
redefine xx(in, out)=[
redefine dec_name_count=dec_name_count+1;
redefine xx_temp="define in" & "_VALUE=" & cvms(dec_name_count);
xx_temp;];
dec_name_definitions;
redefine boole_value=scalar_value;
define frame_exp_VALUE=trans_VALUE; ! COERCION DICTATES THAT THESE BE THE SAME;
redefine xx(in, out)=["out",];
preload_array(
dec_name, dec_name_definitions, string, 1, dec_name_count);
! operators;
define operator_definitions=[
XX(NOT)
XX(EQV)
XX(AND)
XX(OR)
XX(XOR)
XX(SEQ)
XX(SNE)
XX(SGT)
XX(SLT)
XX(SGE)
XX(SLE)
XX(UVECT)
XX(AXIS)
XX(POS)
XX(ORIENT)
XX(TMAKE)
XX(VMAKE)
XX(FMAKE)
XX(VVTRANS)
! XX(SNEG) ;
XX(RINV)
XX(SABS)
XX([+], PLUS)
XX([-], MINUS)
XX([*], TIMES)
XX(MAX)
XX(MIN)
XX(DIV)
XX(MOD)
XX(INT)
XX(WRT)
XX(ROT)
XX(→)
! XX(ANGLE);
XX(VDOT)
XX(VCROSS)
XX(CONSTRUCT)
XX(SQRT)
XX(SIN)
XX(COS)
XX(ASIN)
XX(ACOS)
XX(ATAN2)
XX(LOG)
XX(EXP)
XX(VVROT)
XX(SDIV)
XX(STOS)
XX(NOMV)
];
define
op_count=0;
redefine xx(str1, str2)=[
redefine op_count=op_count+1;
ifc "str2"=null
thenc redefine xxtemp=[define str1] & "_X=op_count";
elsec redefine xxtemp=[define str2] & "_X=op_count";
endc
xxtemp;];
operator_definitions;
redefine xx(str1,str2) = [ "str1", ];
preload_array(OPERATORS, OPERATOR_DEFINITIONS, STRING, 1, OP_COUNT);
! reserved_words;
define reserved_definitions=[
brace_definitions
cm_definitions
statement_definitions
operator_classes
require_definitions
move_definitions
misc_definitions
];
define
reserved_count=0;
redefine zz(name)= [];
redefine qq(name)= [];
redefine xx(name)=[
redefine reservEd_count=reserved_count+1;];
redefine yy(name, special)=[
redefine reserved_count=reserved_count+1;];
reserved_definitions;
redefine xx(name)=["name",];
redefine yy(name,special)=["name",];
preload_array(
reserved_words, reserv@∃H1IK→S]Si%←]fX↓gieS9NX@b0AeKgα+K[↔!C∂?Ww!%l4PH'K↔&+≠';*βki#v7∃%mX4($HKK↔∪,3';∃ε≠3πO≠jm;∞k∃
uXh($$Mil4(HKK↔∪.3';∃πCa#;∞k∃%vXh($$M∪↔∪↔6K;∃βGCS↔7βjo;πn*u↓→α⊂bJ⊗~⊃l4(HH'K↔&+≠';*β∂3π≥→vmv7∃
kX4($J↓↓↓βGCS↔7αbul4PH'K↔&+≠';*βge#v7∃3∨β↔∂'∞a%v@1Q HH≡,V&.m≥f*π∨≡F.oπTε≡f≡>2α2!
$-~'1PPH∀∧ααπ∨~F.o¬KSXh!⊃↔π⊗]Mv∞!≡'⊗∂∃↓PW⊗↑8W↔6\Cε≡f≡:2`O,↑6/↔l\AF&\m⊗vOM≥vw~D ⊗w&\|W∩bε∃Bπ⊗↑8W↔6\Cε≡␈]nBKXQ!⊂O⊗\LV6NlTπGB
l⊗n*D∞7ε.=≤⊗bKY1PPH∀∧ααε≤hλd∧\|→,=8;λG]];≠∧∞~→;L4λ→-Ny8h∞>→8z,≥λ→;LLk↔.aQB"4L\→9R-l(≡>%
X;9%D≤|⊂∩Xtpv∀OmFE∧BP⊂⊂⊂~s1P⊃≤x2qtXv⊃≡w≥v6⊂:~2s1P⊂2v)YqP9x→qtpvλ2s21K.]FEαDx92[4πad_array(
αresarvEd_spEcial, resErved_definitions, integeR, 1, reseRved_count);
whilec [resarv@∃H1G←U]h@|rUeKMKemK⊂1QCg!Kd↑bA:AI←~∀∪7IKckSIJ@D~)%'I-⊗⊃¬"ε
2*α:>Q∧∩&≥α,r>V≡@aα↑εdaα∩>,∩2¬αM!8$)∩β7↔O≡∨∃↓Xh(4(O∪↔β↔4K;∃β⊗+O/.hV!F≡6F/'↑&/≡↑.f.!
↔∞F↑!7⊗/<↑'6.C
ε∂≡↑#]hQ!⊂HH⊃_ -l_c"A⊃<⎇≤M≥Yh_..X>#!.Y<y..Y9⊗fπ\Y<l↑]Y9β
_<r↑K(7'1"B"-≥]→9l↑H_<N>#"L={&≥∂≡→6dπ.Y<q..Y9ε
<z→.%,7 ≥CEαEβ⊂Dtw~z92\p¬rv@∃Hv~∀4∃M←e]CeHAM∪≠!→∀A∪≥$*≡⊗I¬αJ>∞,"VJ∃∧BεN!E~RJ&t9αMnLrRε≡-⊃α6εBIl4(hSCK?≤∧V'<Y(
≥X=ε∞,<y0→≥2r≥FB⊂⊂⊂⊂⊂9z9~w3P9Nβ inte`∂Kdαβ%1βYX4(4R↓↓↓β⊗{?3↔∞qβCK|≠↔βW⊗)β≠'v cOgjCOSKNs⊂~π70π⊗.lXL]Xy(
≥]→9l↑H~j'1 ¬∧Aλ9z94[3P8 2obe+
k ← has@ QfHAβ∪↔O↔↔3↔⊂@
↔=→<@∀NFE∧`7hile (probe ← @IKgKeYKI7WtR7]k1XAI↑4∀∩@@ASLAα+GU#~aβCK|∧&*J∞Mε.r∞,W'<[@∀≥9:rTH2pc@∀AVA>QVF@λ¬∩εNβy⊂≤2yr`2ved_hashe@Hv~∧∪β∪↔SW⊗q#≠πdε6*Kαc"A⊂nc"AQHλλ∧<\XmNJ≤Y.<αy; %d)3 @¬aeGYβ⊃#∂∨iCSgC*Il4$∧ααεmp≤D
(↔hε∀≤⎇→.∧(⊂~[:4v⊂≤2yr`2vedλcmuftthen α if reserved_class[i] ≠ SEX_RES then
outstr(reserved_words[i] & " doubly defined!" & crlf);
β
else
α
reserved[k] ← reserved_words[i];
com_type[k] ← reserved_class[i]+reserved_special[i]*reserved_hasher;
β;
require "<><>" delimiters;
s ← decipher_compiletime();
require unstack_delimiters;
outstr("COMPILED "&s&crlf&crlf&"***** macro delimiters are now ⊂⊃ ,
multi-token macro arguments and macro bodies must be delimited by ⊂⊃");
β;
require init_reserved initialization [0];
! predefined constants;
define constant_definitions=[
XX(GARB_ID, scalar, nil) ! do not move this entry;
XX(PI, scalar, nil)
XX(π, scalar,nil)
XX(INCH, scalar, distance)
XX(INCHES, scalar, distance)
XX(CM, scalar, distance)
XX(SEC, scalar, time)
XX(SECONDS, scalar, time)
! XX(GM_MASS, scalar, mass) ;
XX(DEG, scalar, angle)
XX(DEGREES, scalar, angle)
XX(RADIANS, scalar, angle)
XX(GM, scalar, force)
XX(OZ, scalar, force)
XX(LBS, scalar, force)
XX(OUNCES, scalar, force)
XX(XHAT, vector, nil)
XX(YHAT, vector, nil)
XX(ZHAT, vector, nil)
XX(NILVECT, vector, nil)
XX(NILROTN, rot, angle)
XX(NILTRANS, trans, distance)
XX(STATION, trans, distance)
XX(YPARK, trans, distance)
XX(BPARK, trans, distance)
XX(YARM, trans, distance)
XX(BARM, trans, distance)
XX(YHAND, scalar, distance)
XX(BHAND, scalar, distance)
XX(TRUE, boole, nil)
XX(FALSE, boole, nil)
XX(CRLF, string, nil)
];
define
const_count = 0;
redefine xx(str, i1, i2)=[redefine const_count = const_count+1;];
constant_definitions;
define zap_const(name, type, arg, postfix)=[
ifc "postfix"=null
thenc redefine xx(str, i1, i2)=[arg,];
elsec redefine xx(str, i1, i2)=[arg] & [postfix,];
endc
preload_array(name, constant_definitions, type, 1, const_count)];
zap_const(
preconst, string, "str");
zap_const(
preconst_type, integer, i1, _VALUE);
zap_const(
pre_dimens, integer, i2, _METRIC);
! predefined macros;
define macro_definitions=[
! XX(DIRECTLY, [ WITH APPROACH = NILDEPROACH WITH DEPARTURE = NILDEPROACH]);
XX(CAUTIOUS, [ SPEED_FACTOR ← 2.0])
XX(SLOW, [ SPEED_FACTOR ← 3.0])
XX(CAUTIOUSLY, [ WITH SPEED_FACTOR = 2.0])
XX(SLOWLY, [ WITH SPEED_FACTOR = 3.0])
XX(SECOND, [ SECONDS ])
XX(DEGREE, [ DEGREES ])
XX(RADIAN, [ RADIANS ])
XX(LB, [ LBS ])
XX(OUNCE, [ OUNCES ])
XX(NILVEC, [ NILVECT ])
XX(NILVECTOR, [ NILVACT ])
XX(NILROT, [ NILROTN ])
XX(SETUP_BARMF, [ FRAME BARMF;
AFFIX BARMF TO BARM AT TRANS(ROT(XHAT,180*DEGREES),NILVECT*inches) RIGIDLY; ])
XX(SETUP_BGRih⊗∧VP#) SbP!#T ih≥CE∧D`Q#$l⊂⊂#i iT⊂*'P⊂ i&P⊂j⊂*)⊂g)T)∪j∀$$⊂j⊗_L∃""cT biTK'$f+⊃aj∃4[1t2yJP)$cRb&,]H.TFE⊗,∀$g∩j `f∩m"V∧VP&gk⊃P! i∪P*'P⊂( i%H+dj$λ"*a U$gg⊂λ≡P→U∀bagg⊃)]FEαDgh"S⊂!$ S"⊂*'H→W_∃∩g!d"T]P.TCE,,∀∪'L'*S&⊗∧mH''L'∃f&$g⊃P.TFB,,∀ T()'l∩f`j"S,V∧mH+dj$λ''L'∃f&$g⊃P.TFB,,∀(∀ ¬CISELY, [ WITH NULLING ])
];
! compiler switches and control tabh Kfl~∀~∀∧AβfAQQJAβ0AG←[ASYJAQS[JAMsgiK4Aek]LX@Agα+[↔K∞aβ';&+K'↔&KπS∃ε3'3↔~βπK∃ε≠K↔π&+⊂4 αβπ;⊃ε#↔OS⊗{g↔⊃p↓αS#*β∪↔≠∂+3Qβ/CS↔;≡K?;Mε{→βSF+O*m⊗f/4↔⊗*
I↔∨&\Dε⊗.M}rph!Q"αα∧¬d`⊃≡W≡∂!≡FF*λ→D<|Dλ
≥y(⊂)D≤{⎇.y(≠≥Y⎇8,|!"H∧∧λS xb=<l↑B9Z-L(≠qD<\[n.h→→.L8⎇→,D_↑(∞M→(∀λ~Tq4AQHλλ∧¬Tq6↓_3α<e\>≤∀L↑|z3md≥Y<N=;{@
|H⊂3∧∞{⎇<L<(_slL!"H∧∧λP)Jλ
H→
"(→⊂b<∞<=9≠d{y→!QHλλ∧¬P3∃∧¬P3ε∃"03λ1=≤X-,8⎇≠n/(→Z-L!"H∧∧λP)JH
H→J"(→⊂b0m⎇\⎇_-n≤h_-lλ≥X.-88[T→→1M≥Z=~-⎇\h→M}H≤≤l↑9≠h=y→#!$λλλ¬h3∀h¬¬P3e⊃03⊂a≡};8M⎇λ≥_,-α2P:\pq6"H1<P*~2P("∀⊗XX@≤:w:4[p¬ system
.ALL ALC hybrid s-eXpression/Read AL listifg
.LST PALX P@P-11 assembly code listing
.@IN PALX PDP-1⊃ binary fIle lOadedby 1⊃TTY
.DMP 11TTY PDP-11 core image¬
;
! compiler switches;
αdefife compiler_switches=[
xp(K, false) ! keeP extraneouq intermeDiate files: .ALP, .AHV, .ALT≠
xx(S, false) ! inhibitthe deletion o@_AiQJX
N⊗@β≠'3+X4+cBB11β63O∃HI¬β∨.s↔Kπ&)β¬α∧
2aβ∂≠O↔↔⊗ceβ3O≠S';8π0hW∂¬∧rbl⊗g≡U⊃∩
π>|↔απMt∧d9hU 4~;\nL89⊂≠pε AL@εv~∃apQ∧X↓MCYg∀R∩BAIkTA¬¬∪_AS5[KIS¬iKIr↓C@≠S,ε"π≡<≥fvNlpλ∞M→(⊂m⎇8εpw→⊂64w→]FE,≡∀"V⊂→0v9`%) ! Load the .BIJ f@%YJAS9i↑Ai!JA! @Zbbv4⊃:`,hP4'v#'∂↔~C∂?7∧¬⊗f/#∞7>OL9ε/~βλε¬,¬FEαDr2`&ine
switch_max =xxcount-1;
reDe`
S]∀Aq`Q9C[JX↓IKMCUYhB{lAP≠πn) 2uX∧αππ,X
|9ε_..X>*↓Q\⎇z.Lzε≠L≥9+α,={<⊂∀[2y9]tz1`(es, String, 0, switch_max+1);
λ∧∩∩∪β∪↔&\h
-l(≡⊂≤
4εame, de@→Ck@3 ¬∪m↑LX L≡8ε:,]; Predo@¬H1CEICrP~)goSi
P1IKα3πWN@↓≤{{4
≥→<F∞>z=_m<kλ-{{⊂∩Xw∩⊂_⊂9{t]1t6X|⊃P⊃$r~∧∩%EW←Yα+π9β∂∪@⊗∂⊃Q'∨>≡L6AG<X
∞M8π3mL≥9{t]1t6X|.P≠
λ∧∩+∧ε&}≡\NW⊗*∞L↑y=ε∞>z=_m<jc!∧λλλ$~;]\βry i;
f@=`ARA|@`Agβ#↔A↓λπW;SL¬Bπ∨⎇_
≥∧∧6p↑⊂27P≤{tz1Z9r`4ti`≥OmS:A>↓goSi
P1IKα3πW∪αK6Mkαc"D∧λλgFEεE≤2xz`)re p@IKgKhagoSi
QKfAαK;'SL∧⊗fO,≡FN}i0Wc"@↓D(~_.t⊂ @⊃KGYCICiS←8AP∨→∧#↔W>;';≥π3πK≤≤&f/5Dπ∨&≡.Bε@yH∩
≤α22`._parse;
λS@∪≠A→∃αLrR,xZ"¬¬)x4,%X∧Q$ ⊂4r¬
u∀R)hβP)]RdεTEGER MAX)0⊗~(@@@@λA∪≥$*≡⊗I∧I2R> ¬D7c"H∧∧λ⊂wi≠l.`⊂λ*'j/L≥FE⊂λ⊂⊂ ↔HIHE I≠0 DO TOT←TOT+!π7εVβ %)"Mz2>AE→%%@1Q"αα∧
$-∃0 '
*#j MH∂λA5β Rv4⊂ ↓↓α
l4Ph ⊗Nl4ε&.,¬0∪F1sv`0ile QQK@;_I¬βO|¬V*πl≡&N∞-@ .P:40]⊂1pwλ12P 5pπ@↔⊃∧∧fo∩LV↔9yz-ll¬FEαy2xzZy2P⊃⊂αREAK,¬⊃ %hbP∩BU`∩$≤p↔`5p¬GJ⊃α3'3∀β1P@! ∧DDα@ ∪$A)$@#∞sdc∞d∧↔>h∧FEελ9_⊗λλλr__s8, __s9;
integer
__i0, __i1, __i2, __i3, __i4, __i5, __i6, __i7, __i8, __i9;
real
__x0, __x1, __x2, __x3, __x4, __x5, __x6, __x7, __x8, __x9;
procedure debug_init;
α
__r0 ← __r1 ← __r2 ← __r3 ← __r4 ← __r5 ← __r6 ← __r7 ← __r8 ← __r9 ← null_record;
__s0 ← __s1 ← __s2 ← __s3 ← __s4 ← __s5 ← __s6 ← __s7 ← __s8 ← __s9 ← null;
__i0 ← __i1 ← __i2 ← __i3 ← __i4 ← __i5 ← __i6 ← __i7 ← __i8 ← __i9 ← 0;
__x0 ← __x1 ← __x2 ← __x3 ← __x4 ← __x5 ← __x6 ← __x7 ← __x8 ← __x9 ← 0.0;
β;
require debug_init initialization[0];
endc
! The following (making all of parse a recursive procedure) is a hack to get the
restart option to work properly. As soon as a better way is found of
making sure everything gets reinitialized properly, this should be taken
out;
IFC FALSE THENC
recursive procedure hidden_parse;
α "hidden_parse"
ENDC;
! ---- DECLARATIONS ----;
external integer
rpgsw;
RPTR(file)
AL_file, ! AL source file;
SEX_file, ! s-expression file;
BIN_file, ! PALX binary file;
ALL_file, ! ALC listing file;
LOG_file, ! LOG listing file;
NEW_file,
PRESENT_file; ! Present file;
BOOLEAN
DISK, ! TRUE IF INPUT IS COMING FROM DISK;
AUTO_PROCEED, ! TRUE IF AUTO_PROCEED SWITCH IS ON FOR ERROR RECOVERY;
IGNORE_CORRECTION, ! TRUE IF DONT WANT TO MODIFY BUT JUST CONTINUE;
LOGGING, ! TRUE IF LOGGING WANTED;
COMPILE_LOGGING, ! TRUE IF LOGGING WANTED THROUGH REQUIRE STATEMENT;
now_top_file,
LOG_FILE_OPEN,
STRICT_DIMEN_CHECK;
ifc dup_file thenc
BOOLEAN
WANT_DUP_FILE; ! TRUE IF WANT CORRRECTED FILE;
endc
STRING
cmd_line,
INFILE,
OUTFILE, ! INPUT,OUTPUT & LOG FILES;
NEWFILE,
LOGFILE;
INTEGER
CHANIN,
CHANOUT,
CHANNEW,
CHANTTYO,
CHANLOG;
STRING
OUTSTRING,
PARSED_STRING,
INSTRING, ! INPUT STRING;
TABLE1; ! BREAK TABLES;
! GET_TOKEN VARIABLES;
REAL
REALNUM;
INTEGER
TYPE_OF_RES_WORD, ! TYPE PULLED OFF OF COM_TYPE;
SPECIAL_INFO, ! INFO PASSED FROM SCANNER TO PARSER - DEPENDS ON TYPE;
ID_TYPE,
ARRAY_TYPE,
PROCEDURE_TYPE,
BLOCK_LEVEL_OF_DEFN,
RESERVED_TOKEN_PTR,
TYPE_OF_TOKEN;
define
special_token =-1,
undeclared_token=0,
id_token =1,
numeric_token =2,
string_token =3,
macro_token =4,
MACRO_BODY_TOKEN=5,
metric_token =6,
reserved_token =7,
array_token =8,
procedure_token =9;
STRING PROCEDURE TOKEN_TYPE_TRANSFORM;
α string s1;
s1← CASE TYPE_OF_TOKEN OF ( "undeclared","id","numeric",
"string","macro","macro_body","metric","reserved","array","procedure");
return(s1&"_type");
β;
STRING PROCEDURE ID_TYPE_TRANSFORM;
α string s1;
s1← CASE (ID_TYPE + 2 )OF ("string","form","boole","scalar",
"vector","rot","frame","plane","trans","event","atom",
"world","on_label","calculator_label",
"changer_label","statement_label");
return(s1&"_type");
β;
STRING
TOKEN,TOKEN2,
TOKEN_FRONT;
RPTR(ANY_CLASS)
TOKEN_PTR;
! END GET_TOKEN VARIABLES;
integer
word_R_break, ! break tables;
non_blank_break,
word_S_break,
close_brace_break,
non_digit_break,
quote_break,
macro_delimiter_break,
semicolon_A_break,
cr_break,
paren_cr_break,
lf_ff_break,
semicolon_R_break,
knvrt_break,
omit_break,
tty_input_break;
STRING
CURRENT_FRAME; ! TOKEN OF THE CURRENT FRAME - DEFAULT SET TO "YARM";
INTEGER
SPACING, ! SPACING FOR OUTPUT;
SAVSPACING;
BOOLEAN
REJECT, ! TRUE WHEN THE LAST TOKEN IS REJECTED BY THE CALLING PROC;
switch_file,END_FLAG;
INTEGER
DEC_NUM, ! THE NUMBER OF DECLARATIONS IN THE CURRENT BLOCK;
ARRAY_DEC_NUM,
PROCEDURE_DEC_NUM,
MACRO_DEC_NUM, ! THE NUMBER OF MACROS IN CURRENT BLOCK;
DIMEN_DEC_NUM; ! THE NUMBER OF DIMENSIONS IN THE CURRENT BLOCK;
STRING
OUTEXPR; ! FOR THE CONSTRUCTION OF THE STRING FOR EXPRESSIONS;
STRING
OPEN_BRACE;
INTEGER
CHECK_TYPE_VAR; ! RETURNS TYPE OF ID FROM CHECK_ENTRY;
STRING
MACRO_STRING;
! ERROR VARIABLES;
BOOLEAN
INSIDE_MACRO_DEFINITION,
INSIDE_DECLARE_P,
INSIDE_CONDITION_MONITOR,
INSIDE_STRING_DECLARATION,
INITIALIZE, ! INITIALIZATION PROCESS;
GLOBAL_BACKUP,
patch_code,
GLOBAL_MODIFIED,
PROMPT_FOR_MODIFIABLE_ERROR_ONLY;
INDEGER
NUM_OF_ERRORS,
INSIDE_STATEMENT,
NUM_OF_ERRORS_FLUSHED,
NUM_OF_ERRORS_MODIFIED;
! END ERROR VARIABLES;
↓INTEGER
RUNTIME;
! recorddeclarations;
RCLASS
λPARAM_DIST(
STRING
ID,
α USER_AD≠
↓ RPTR(PARAM_LIST
NEXT
);
α
RCH β'L~∃≠β
%≡1→%'(@~(∩∪')I∪⊂~≤hQ↓↓↓¬2ε2V*`$%¬∧
∞@%X→B∧l_:$zε-|GKXQ$ααα _CXh!⊃∀LuHXt-⊂Q$ααα jTkX⊃∀∩∧uYX$-∩ xb¬∧~(∀l-HZ%≠XQ!⊂M∃
J"Dl_:$yDβ∩4jE#"H∧∧λ∪Q+
α"$∀∀∪r)j∀h∃ t⊃Q6
D∪00j)h⊂d∩a`λ HASHES T@≡AQ⊃αA≤
6∃α,rRJeXh)↓↓αα2εN ¬@HJ∀λ$≤4
∧|LhHU∩∧→`λ
I⊃(∀h→1(∪ ~u∞c!$λλλ I3R`≥BDPP*Tbb⊂'S&,P#∪i⊂( T fbj⊃i⊂"l∀ g!dSg⊗⊂(∪dg ∀S T@≡AQ⊃
4PH$%↓¬αεJεl*R⊗I∧"⊗~&t*⊃α*-~Qα
,2>J∃¬""&M∧z:∃lhP$&J¬"I"B
∩ε4bdJNQ$hQ↓↓↓¬αεJεm→l4(HJ&:R,:⊗H4R↓↓↓α∀b>∞,Db⊗Z⊗aB>_b$*~84RIl4(hP$&J¬"I"6~J<bdJNQ$hRR>@EαεJεh`4+∂,ε'⊗.nCεn∞>-r`h*Iu↓DX_5∀zAQ$≥4F∪(_tSnaQB"4J
∀J∪(_tSf I4u∀H i) VFA&`Pi'D*⊂a&"mL≥6pq\7L40\t2y.NFEεEβEεEεB∧Di!S iaFB&`ai∪L)j PePεEαDi(*∀∀&`aT'L&$Tj∀FEλ⊂⊂⊂&∩ij(∃)→FEαDi(*∀∀&`aT'L)j⊂aaTFB⊂⊂⊂⊂∀h aeF& NK
);
RPTR(MACRO1M)βπ⊗αH4*6~J<b≥"ε∞,E"6A0hR6ε∞α)qE≥F ∞aQ@εE∧Bi!f TiFE"∩dbg)F"hλPONANT(
∩∪M)%∪≥≤~∀@@A≥β≠∀v~∀∩%∪∃)≥$~∀@@A %' ∩εt~∃04R↓↓↓ααI∀l*A∀∩∧≤~hU~∧Xε∀ yβ"g*∀P ∂F VARIOUS COEFFICIEN@)Lv~∧@@A≠βM&X~∀@@Aβ9∂⊂∩∃`h)↓↓αα~>J≤)l4(HJJBR⊂B∩&6,rLb⊗β
∧|@Q3U¬⊃ ¬⊂⊂λ⊂'"l∃⊗εE⊂λ⊂⊂& Tj≥FEαDdg*⊃cbiεB⊂⊂⊂⊂⊂& ∂CK_LEFEL_GF_D@
≤4⊂R`,hP$&J¬"I"∩STANCE_DIMENS,
TIME_DIMENS,
! MASS_DIMENS;
ANGLE_DIMENS,
FORCE_DIMENS,
TORQUE_DIMENS,
VELOCITY_DIMENS,
ANGULAR_VELOCITY_DIMENS,
TOP_DIMENS, ! POINTS TO TOP MACRO IN THIS BLOCK;
EXP_DIMENS;
RPTR(DIMENS_EXPONENT) ARRAY
DIMENS_TABLE[0:metric_hasher],
D_TABLE[0:metric_max];
RCLASS
ID_LIST(
STRING
NAME,
BODY;
INTEGER
FLAGS,
TYPE;
RPTR(ID_LIST)
NEXT, ! POINTS TO NEXT ID WHICH HASHES TO THE SAME ENTRY;
LAST; ! POINTS TO THE ID DEFINED JUST BEFORE THIS ONE;
RPTR(DIMENS_EXPONENT)
DIMEN;
INTEGER
BLOCK_LEVEL_OF_DEFN
);
RPTR(ID_LIST) ARRAY
SYMBOL_TABLE[0:id_hasher];
RPTR(ID_LIST)
TOP_ID;
RCLASS
array_LIST(
STRING
NAME;
INTEGER
FLAGS,
#DIMENS,
TYPE;
RPTR(array_LIST)
NEXT, ! POINTS TO NEXT ID WHICH HASHES TO THE SAME ENTRY;
LAST; ! POINTS TO THE ID DEFINED JUST BEFORE THIS ONE;
RPTR(DIMENS_EXPONENT)
DIMEN;
INTEGER
BLOCK_LEVEL_OF_DEFN
);
RPTR(array_LIST) ARRAY
ARRAY_SYMBOL_TABLE[0:array_hasher];
RPTR(array_LIST)
TOP_array;
RCLASS
procedure_LIST(
STRING
NAME;
INTEGER
FLAGS,
#ARGS,
TYPE;
RPTR(PROCEDURE_LIST)
NEXT, ! POINTS TO NEXT PROCEDURE WHICH HASHES TO THE SAME ENTRY;
LAST; ! POINTS TO THE PROCEDURE DEFINED JUST BEFORE THIS ONE;
RPTR(DIMENS_EXPONENT)
DIMEN;
RPTR(id_list,array_list) ARRAY
ARGS;
INTEGER ARRAY
isid,ARGMODE;
INTEGER
BLOCK_LEVEL_OF_DEFN
);
RPTR(procedure_LIST) ARRAY
procedure_SYMBOL_TABLE[0:procedure_hasher];
RPTR(procedure_LIST)
TOP_procedure;
RCLASS
SOURCE_LIST(
INTEGER
CHAN, ! i/o CHANNEL NUMBER OF input, -1 if from macro;
NUM, ! NUMBER OF PARAMETERS IN THE CURRENT MACRO;
PN,
LN; ! PAGE AND LINE NUMBER OF THE PUSHED FILE;
STRING
CUR_STRING, ! curline WHEN PUSHED;
CUR_STRINGR, ! curliner WHEN PUSHED;
FILE_NAME, ! NAME OF THE INPUT FILE WHEN PUSHED;
P_STRING,
MACRO_STRING;
RPTR(SOURCE_LIST)
NEXT;
RPTR(MACRO_STACK)
MACRO_STACK_TOP;
RPTR(MACRO_LIST)
CUR_MACRO;
RPTR(FILE)
COPY_FILE,
FILE_PTR;
INTEGER
CHANTTYO,
CHANNEW
);
RPTR(SOURCE_LIST)
TOP_SOURCE;
! other declarations;
INTEGER
EXP_TYPE; ! TYPE OF EXPRESSION FOUND BY P_EXP;
BOOLEAN
PLAN_STATEMENT; ! TRUE IF CURRENT STATMENT IS PREFIXED BY PLAN;
STRING
CHANGER_HEAD; ! NON NULL IF PARSING A STATEMENT INSDIDE A CHANGER;
INTEGER
T_COUNT, ! COUNTER FOR PRODUCING UNIQUE ID'S;
S_COUNT; ! COUNTER FOR PRODUCING UNIQUE SCALARS;
BOOLEAN
NO_OP_SO_FAR,
OP_EXPECTED; ! TRUE WHEN P_EXP EXPECTS AN OPERATION;
INTEGER
DELIMITER_1,
DELIMITER_2; ! HEAD AND TAIL DELIMITER OF macro bodies;
INTEGER
MAC_NUM; ! NUMBER OF PARAMS IN THE CURRENT MACRO EXPANSION;
INTEGER
BLOCK_LEVEL;
! GARBAGE DECLARATIONS (VERY LOCAL);
BOOLEAN
T,
EOF;
INTEGER
COUNT,
I,
N,
BRCHAR;
STRING
GARB;
INTEGER
LINENUM,
PAGENUM,
SOSNUM,
typed_page_num, ! on tty;
sourcelvl;
STRING
CURLINER,
CURLINE;
! error, error_recovery, error_reject, print, file_indent;
FORWARD RECURSIVE PROCEDURE P_STATEMENT;
FORWARD RECURSIVE PROCEDURE GET_TOKEN(boolean noexpand(false));
FORWARD PROCEDURE OPEN_DOGGING_FILE;
forward RPTR (ANY_CLASS ∩AA%∨π⊃+%
A
⊃π⊗a≥)%d@Q' I∪≥∞ALvAβ≥Q∂$↓)β¬→∀1)3!∀Rv~∃→←eoCIHA%!Q$@Qβ921π→¬'&@%¬αJ>∞,"VJ∃∧J:N⊗∃ b⊗:%∩e↓"≥"J&::αMl4PJ&:R,:⊗Iα$
2∀E"fB∃ZαJBR∩Bε:dD~2εN~IαJI
B:V2aBJ,9z$"J↔1PPh,iw↔≡≡,Bε⊗⎇x\;H≤∞-xy9∞↑Y(→m}ε≠u.N≥=
*∃∀Jm;→*$λNh≤nNZ;Yd>≥
n;≠
%↔c"C!*T⊃∀Eλ3R&λ9α iiJP()'Pbb*i⊃P"i)∪i10\tqT$S*"cbT⊂$]iU)$g#H)T]FBεEεEαPP$P→7w∪zλ:w22\9z0w→⊂:42H2y97\⊂7:vX2y⊂9]:s3↔λ⊂ v&λ2y97\9P7:[q2y2Y⊂→__βE∧P⊂~0{2P_2rw⊂_p22rλ1<P6YP0w2λ1pw⊂_2P0y_4z90\4v<P≤2pyyZsw2rεEεEαDDDDT%⊂≤πLX↔[[βEεE∧H$P9t≠zv2⊂~0{2P≠pr2P≥44yP_wvvr[:⊂2p\64ri⊂1:`4 didn't. The epror
number Iq meanifgless to the user. IT is even usefuL to The~∀%aKOaαc∃β7}#'≠gNs∃αB
∩N∃1π#=βSF)β↔c&+;Qβ&CπQβLεBεF]Nπ4≥≠hm9⎇0→→FE∧w]z⊂;t→y2P*~2P2`2ror iq coMing in from inthe sourcE prograe.
AcTually, the error numbers shouLd be usedto indicate on
which pag`
A←β⊃β3'v)βS#*β∂?∪*β'M9αα;W↔⊗+K';8∧εn∂∀&*π↑8 ,n;β"A≤[|@⊂≥42P:\ry⊂4Y⊂;rP≥pw:⊂≥7P40]2P0@≤vpv&λ80y9Yy⊗⊂ [2⊂9`4ore
error messages on a disk file.
MSM 3/5/7`@v~∀λA∪≥$*≡⊗I∧aE2⊃⊂π2α∧)ytd,→`¬¬∀x8T,#4∧∧LUHXt-∩λ9tll→hAD≤λ~#J∧)ytd,→`¬$-*8SXh**¬%∩λ→eID9H∃≥~α(∀
)pq1
ZQ(⊃**StF
(αagk⊃i,T$S*"cbT⊂ T]CE$c⊂∩↑XYP∃$"g⊂⊂)(*∀∀ b∪$ij∧Q_]FEαgjb)U)∀!i∪#∪⊂⊃⊂ww:4[:rP 7ill declare it internally")3
D1←INSERT_ENDRY(TOKEN,ID_TYPE_TABLE);
ID_LIST:TYPE@7⊂c;?)Iβ≥&1Yβ⊃+
l~∀β∪⊂1→∪'Pu¬→∨
⊗12-2⊗0@ xaD∧Xie\#≠[t∀dx91DdZhTcXQ!∃∀-JZ$rDF∃∪Xh!⊂0hTYJ4*Q)∀2∧↔VS*¬IλTr$∧π∨'-≥f*π74π≥}n]FcXQ!∃<D→HR∧dYhu$B
5∪kαλ→d"X~U$y
$|≤XXB∧$t hPα3u*Ju∀Bλ:S⊃ID∧U≡<T~;@=|\Y,>λ→Z-L(IP⊃\4∧f& *");
`'⎇S]GQ]XvA!I_∞∞⊗,"}@%*XSXh!≥⊗2εL]f?&¬∞2I[∧λ
9H~-lZ;→+}nc"A⊃" naQB4Q*J4SJ j3∪ε
(αagi⊃∀YFEαAFE"S)bFE∀ j*i∪∀' ∃LL_RECORD);
¬
RPTR(ANY_CLASS) C10⊗~)gieS9H
βO␈+C∂∀Gβ?MlhRNBJLr≥α∩Lr∃2I→d-∪1Q'≡␈↑,6)G
}5z∀m→F*α$d∧LTi→D*2∧!B¬ε≤|Rα∩dλ55~λλ∀<,jYR[
∀dα∩b M⊗v*∧ DλuTj I3Q3JY*.c!)∩3Q+xu0S →β"]@ LINER←CURLIJERl~∃∪↓π⊃β≥%≤8Zb↓)⊃≤∧@BAM+¬')%)+)
↓ +≠≠dA!β%¬≠)I&A∨↓≠βπ¬<A
∨$ααJ,→D¬$D→hsXh!⊃∀LuHXt-∩ ⊗∩e∧~(∀iD9zTu#1Q HO=}W,y&≤
}whλH≡λλ@∪≤wzy1YL87yI1y6# ⊃4w9Zp∧e Macro "&`≠C
eV!YαKOQkL"g∂W↔∪↔;PFkπ∂K⎇il4(HK'2
H
-l<O4n8y(∞M→;@⊂≠4p∞e@I?YS]∃e6dAβ#=:hπ0hP⊃→∀2αα⊂⊂*(3&⊂i@hg ∀←SH∂+∀~∀bI~5#Th¬3+:α'h∀dπU@%
:R@x@`~∀$∪)",qλ∀PH$'O'∪';≥ε@↔⊗∨∀πε∂,≥QFNEH≡X;&≡Yv`_Nαparam_co@U]a:@Xh($⊃~%¬%%
ε∂⊗≥SεfO>@
$∞_<X-S≤≥≤G1bst(string old_string);
α string t,t1,old;
integer brchar,i1;
old←old_string;
t←scan(old,temp,brchar);
while brchar≠0 do
α t1←old[1 to l1];
old←old[l2 to ∞];
for i1←1 step 1 until param_count do
if equ(t1,param_arg[i1])
then t←t¶m_id[i1];
t←t&scan(old,temp,brchar);
β;
return(t);
β;
param_ptr←macro_list:params[current_macro];
source_pos←source_pos&"(";
for i1←1 step 1 until param_count do
α param_arg[i1]←param_list:id[param_ptr];
param_id[i1]←param_list:user_id[param_ptr];
param_ptr←param_list:next[param_ptr];
source_pos←source_pos¶m_id[i1]&",";
β;
l1←length(source_pos);
source_pos←source_pos[1 to l1-1]&")"&crlf;
l2←(l1←length(param_arg[1]))+1;
t←param_arg[1][1 for 1];
setbreak(temp←getbreak,t,null,"INR");
line←subst(line);
liner←subst(liner);
RELBREAK(TEMP);
β;
β;
WHILE EQU(LINE[1 TO 1], lf) DO GARB←LOP(LINE);
L1←LENGTH(LINER); L2←LENGTH(LINE)-L1; PROCEED←AUTO_PROCEED;
IF ¬PROMPT_FOR_MODIFIABLE_ERROR_ONLY OR global_backup
then α
IF global_backup THEN PROCEED←FALSE;
ifc debug_compile thenc
OUTSTR(crlf & "ERROR TYPE " & CVS(I));
endc
IF I<0 THEN OUTSTR(crlf &"WARNING: ") ELSE OUTSTR(crlf);
OUTSTR(S & crlf
& source_pos & crlf & LINE[1 TO L2] & lf & LINER & crlf);
β
ELSE IF PROMPT_FOR_MODIFIABLE_ERROR_ONLY THEN PROCEED←TRUE;
C1←ERROR_RECOVERY(I);
IF ¬LOGGING THEN IF COMPILE_LOGGING THEN OPEN_LOGGING_FILE;
IF LOGGING THEN
OUT(CHANLOG,crlf & "ERROR TYPE " & CVS(I) & crlf & S & crlf
& source_pos & crlf & LINE[1 TO L2] & lf & LINER & crlf);
IF IGNORE_CORRECTION THEN PROCEED←TRUE;
IF I<0 THEN PROCEED←TRUE;
WHILE ¬PROCEED DO
α
CLRBUF; OUTSTR("$"); DO COMMAND_CHAR←INCHRS UNTIL COMMAND_CHAR<0;
COMMAND_CHAR←INCHRW;
CASE COMMAND_CHAR OF
α
["b"] ["B"] α
OUTSTR("ail" & crlf);
IFC debug_compile
THENC BAIL
ELSEC OUTSTR("Sorry, Bail not loaded." & crlf)
ENDC;
β;
[cr] α CLRBUF; PROCEED←TRUE; β;
["c"] ["C"] α OUTSTR("ontinue with default recovery"); PROCEED←TRUE; β;
[lf] α PROCEED←TRUE; AUTO_PROCEED←TRUE; β;
["a"] ["A"] α OUTSTR("utomatic continuation");
IF LOGGING THEN OUTSTR(" and logging");
OUTSTR(".");
PROCEED←TRUE; AUTO_PROCEED←TRUE; IGNORE_CORRECTION←TRUE;
β;
["e"] ["E"] α OUTSTR("dit" & crlf);
CLOSO(CHANLOG);CLOSO(CHANOUT);
EDFILE(INFILE,LINENUM,PAGENUM+1,0);
β;
IFC FALSE THENC
["I"] ["i"] α OUTSTR("gnore trying to modify"&CRLF);
PROCEED←TRUE; IGNORE_CORRECTION←TRUE;
β;
ENDC
["r"] ["R"] α
OUTSTR("estart"); CURLINE←CURLINER←null;
USERERR(0,1,NULL,"S"); ! THIS IS A HACK AND SHOULD BE CHANGED
AS SOON AS POSSIBLE;
β;
["x"] ["X"] α OUTSTR("it" & crlf);
USERERR(0,1,NULL,"X"); ! DITT@≡A¬¬∨-
↓π∨≠≠∃≥(v~(∩∩εv4∃6Eh :∪6EPE:∩∧↓∨+)'Q$PEKIgJD@_AGeY_RvA)∃%'?Q%+
v$εv~∀4∃6El :∪6EXE:∩∧↓∨+)'Q$PEKIE←gJλ@LAGIYLRvA)%M?
β1'
v@v~∀~)6E`Et∪6E :∪∪↓!β)π 1π∨ ∀A)⊃8~∀∩∩$∧~∀∩$∪∨+%~RI!⊗S∂!π≠?WK≡)β∂?&)mβ7}#'≠eε3?33⎇;';≥εc';∃∩2∞J22Il4(HH&∞2∀∩V→@1Q HH→It$,E DLtZ%∪Xh!⊃⊂L≥X)DLtX+tLt9
tcXQ!⊂HL:Z$dLh[tdLh[3
¬It∧c∃T∧b∧≥Z)DLtZ'0hP⊃⊃∃∧
H9↓D≤xHU|4→J4+XQ!⊂HM
)t≤,XKu%∃XW0hP⊃⊃∀u,S t1DZ*$⎇∃3 T|$_i∀,%yjTiDxc∧-∃)z%→DYxDL4_XB[1Q HH⊂1PPH∀∧α∧,J8R∧⎇ZJ5%∩∧,↔&≡∧¬RαR%%"Rπ=}'↔JD
f}r↑↔&≡≤&f*↑'⊗␈$¬"RR%$"4≥)HbKXQ!PUZ-T%hM4)R∃h→_b∧<Ix$aλ(∀≤]Z∧¬$DYaPPH⊃⊂"¬≥J)∀t:
6∩e≠'1PPH⊃→u-%8J"B⊗|M⊗7J∞Mε*εm⎇Ff␈⎇≥f:∩∧d∧≥∀He∪Xh!⊃⊂M∧~*4,!
:E∀Lh{u∧
*8T!E:J$Ltth5-∀I→d-∪>6%}w]MCXh!⊃⊂M< →D*XZ∃*Eλ~%≤,C
5%∀→hrduYIBHh!⊃⊂L$t L≤J(%,31Q HH⊃~3
⎇88∀rEλ~%≤,C
5%∀→hrddcλd1D*(TZH*$≤D~%∪Xh!⊃⊂HL_d¬≠
6⊂∧4⎇$ε∃kn>$ε␈∩∞6∃[
mw∩β≠Tβj∧HaPPH⊃⊃∩α¬IλTr$∞3∃␈6↔2¬≠≠}6≡∞e∞ε∂↔<\AG∨N-⊗v:D
F1Flcε↔⊗\≥2f↔,=ε∂∩↔03Xh!⊃⊂HL_d∧d,hzDBE6⊂
#6λ∃∩λYHλA→∪q⊃(E∀l*'4∀l7i→Pr∃iGhnaQB""!~lWtf$Tl)H:S⊃NaQB""$∧λnaQB""(:4S∩)h7pu*)∩3Q*+tlNaQB"")z5∀u
)3Qwjλ4Tq(C∀u∀I→QwsJY∪∞c!!""1iIpP3β 3q∩(i11↔j
Spq(X↔u∀JX,¬FEαDDcf∪a f⊂ aejT/c f∀b]FEαDDg*SL'c⊃i)'i∀L&gb∩c$bb↔g*fL∪c"i∀'i)L∪gb$c∩bb∃HNFE∧DBy2u2Xz/s0[9r]FB∧DDACE∧DbS)bP⊂λ'jj)U)∀⊃)[y9<P_pw∪zλ27P1_quzxλ∀YFEβEεE∧VQ∨Q.Bdc⊂αU"i)bH*$"gβE∧DAβE∧DgUj)b)
⊃)2x≠<P-aT.P7`2 ""C"" to continue," & crlf &
"[LF] or ""A"" to continue automaticallq," & crlf &
"""I"" to ignore trying to modify," & crlf &
"""E"" to ediT source file," & crlf &
"""R"" To restart" & crhf &
"""T"" fortersE," & crlf &
"""V"" foR verbose," & crlf &
"""X"" to exit");
IFC DEBUG_COIPILE THENC OUTSTR("," & crlf @DλE∧DD↓iVAY=C@A¬¬SXDRlA≥ ~∀∩∪%@→=∂∂∪≥≤A)↓8A∨+%~RI!⊂a ↓→∧≠K#→α1↓ ∀a↓ β4{Iβ3};∨'≠:⊃%l4PH&&→∧:2>
`b
ε≤ZVAα$B⊗9α⎇*RNR∩A 1 α1β∂Kf1↓ ↓∩⊃
5 ⊂β≠?Iεk?∪'7K';≥π≠?WK≡)β∂?&) %LhP$&>-"N@%%∧"r∩∧dε∨⊗Le∪Xh!⊃⊂_h!⊃∀,E8T∧⎇
J:E∩B)z¬$Lyj2ε∨%MF2dUJ"e"K¬D∩dEIRd:D⊗v"
grε6} λ∞l<X[n<(IPj)⊃J.aQC"Vd-λW"+4SλW!→1H↓)Iqqr)hh⊃∩λY@εE∧BDAεEαD@gh⊃g&'Qcdg#F#$f"NFE∧DBgjj∀⊂d g&∪cV1y≠3⊂∪⊂λ i)'T⊂*,h⊃P⊃⊂∪λ!k)T∩TP∪⊂_y63⊂ ⊂)P∪λ1y63βE∧DDBS⊂9w]y1rL≤7yP∪λ1y63λ⊃⊂&$S"mXP∃'P&→↔P∪⊂6→⊂∪⊂&∩e"i ⊂1y6→∀]FEαD@gjU)j)∀λ5sst[3P4wλ34v2H70vrH⊃⊂∪⊂∪'cc$S P∪⊂_y63⊂
]FE∧BDAFEαDP⊂"S)bP'Uj)b)
⊃7ssZw3P0[92pr≡Q∀]FBεE∧bS)bP'Uj)b)
⊃⊂*g≤2qws[4⎇2rλ1t0y_qz2y∞P:<x→P⊃⊃∨H⊃⊂37\⊂0v6≠{pq6→P1t0\0qz2\9W⊃∪_y63∀CEεE∧BA]FEαA]FE∩c⊂$←⊂*$"S⊂'*fF'c"T)'i)Wg*fL∪c"i∀'i)UL]FE#S'a fε! aeUh/c S)b]FB)"j*T'∀!XJ]FE↓NFEεE∀(*)∀⊂g,L!S iiTH()'aQb*i"H"i)'T10yZqL)"R aj∀∩g*"cQi⊂$]Tj)$g⊃P)T]CE⊂⊂⊂λ↓⊂⊂)∀*)⊂∀⊂g,L!S iiTT_]P)oba)∪i10\tqT$K)T]P∀"e"aU/j)*Q]P)"U*i'∀∀_T]P]FEεB()'aQb*i"H()$g∃∀)b)∩e#P)J]FE⊂λ⊂⊂↓εB⊂⊂⊂⊂~s1P2→q:sL_wvx4[2P7`2 true thenc commentused to be only debug_coMpile ;
INTEGERI,@∀Y,Y_v~(@@@A→∨$A∪|bA' ∃ @bAU≥)∪_↓'!βπ%≥≥α$yαN⎇⊂∧αα∩j70hR∧∧α∧UyHTtu∩α
5,¬FEλ⊂⊂⊂+R$f"P∩∨≤_⊂⊃'FE∧@≥FE∧Ro\_≥CE∧kd∩f"P%G%⊂ g⊃⊂αbhUT)`≠K T@≡A-:XD@λRA ≡↓↔?εVDr~∀∪%A∨+Q' ∩JLr≥M∧rV2D
DD,d w/'>N&Nv{xn↑≤⎇≤M≥YiXn-α3∪)VXP:7H%nFEαDbf)QP7rz≤z94g→oym@1 to K];
! KU@(!∞"εtzVA2≥YEαRzα.u↓2βπK∪2Il4λM~}NnX¬3
¬It∧Ukαc"A→Pπe⊗R]BE∧@]FE⊂λ⊂⊂$cλ'j`∀STRING≠H
+→0A)",qβ/W'≠SKπv:␈?W'≠SKπv9≠∂Kd∧b7_Q!∀,@∀q(
}=≤p~≤αi`≥O⎇`
l4R ↓↓α⎇*Q"∞D
:.V ¬E4 H⊂⊃\αh LRl~∀@@AK@3≤∧V_hαHλ∧∧⊂∧g*⊃cba2]FEλ⊂⊂#'T⊂ ←DA')@@bA,rR&1¬~Bε∞Lr∃α∩xJNm α↓∩Th
FBα IF OUTSTRIL¬≤@9jTdbλ¬∩λYβ⊂7`5tstbing←o@UigiE%]NMGβ∪3→≠_h ⊂LYJ4*ε|¬0~≤βtri@9O0∨Mβ1P@$(λλ @h¬T(BHANOUT,S & crl@_Rv~∀@@AK9IFv~(@@@@p4λhSCK|8 ,Nαy2P→4pe_ijde@9hAS]QK@∨↔⊂∧εJJαc"D∧λλAQHλλ∧∞α8 `!α+⊂cC∞;∀c;,¬R¬@h→P⊂[9rP≠
λ outs@Q` ! α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓↓↓↓α↓∃[∀→M@y⊂2)S:Rv4⊂ ↓↓α
l4Ph ∃∧∧SphX⊃0 "H()$g∃'b`∀; α α~∀α↓↓↓αL1α>⊗αJ5%∀→hq\@U3∪∧
⊂∧"gλ'`∃@(αB≤D→iu-λε'jU)j)$Rα@∞MπI→∧Bv4⊂ ↓↓β∪∧A∀"*,8¬⊗U)*bFBα THDner; β ELSE
CURLINE←CURLINER;
OUTSTRING←NULL;
ifc dup_file thenc
IF WANT_DUP_FILE AND CHANIN > -1 AND CHANNEW > -1 THEN
OUT(CHANNEW,PARSED_STRING);
endc
PARSED_STRING←NULL;
β;
RPTR(ANY_CLASS) PROCEDURE ERROR(INTEGER I;STRING S);
RETURN(ERROR_BASIC(I,S));
RPTR(ANY_CLASS) PROCEDURE ERROR_REJECT(INTEGER I;STRING S);
RETURN(ERROR_BASIC_REJECT(I,S));
PROCEDURE UNDEFINED_VAR(STRING VAR(NULL));
ERROR(0,"UNDEFINED VARIABLE "&VAR);
PROCEDURE UNAFFIXED_VAR(STRING VAR(NULL));
ERROR(0,"UNAFFIXED VARIABLE "&VAR);
! process_switches, got_input, got_output, open_logging_file, open_new_file,check_want_copy;
procedure process_switches(RPTR(file) F);
α RPTR(file_switch) swt;
swt ← file:switches[F];
while swt≠null_record do
α integer i;
for i ← 0 step 1 until switch_max do
if equ(file_switch:name[swt], switch_name[i])
then α switch_setting[i] ← true; done β;
if i > switch_max then
begin
outstr("""" & file_switch:name[swt] & """ unknown switch but will pass it through"& crlf);
switch_name[switch_max+1]←switch_name[switch_max+1]&file_switch:name[swt];
end;
swt ← file_switch:next[swt]
β
β;
boolean procedure got_input(RPTR(file) F);
α
if file:chn[F] < 0 then file:chn[F] ← getchan;
if file:in_bfrs[F]≤0 then file:in_bfrs[F]←12;
open(file:chn[F], file:device[F], file:mode[F], file:in_bfrs[F],
file:out_bfrs[F], count, brchar, eof);
if eof then
α release(file:chn[F]); file:chn[F] ← -1; return(false) β;
infile ← make_file_name(F);
lookup(file:chn[F], infile, eof);
if eof ∧ length(file:ext[F])=0 ∧ length(file:def_ext[f])≠0 then
α "try default"
file:ext[F] ← file:def_ext[F];
infile ← make_file_name(F);
lookup(file:chn[F], infile, eof);
β "try default";
process_switches(F);
return(¬eof)
β;
boolean procedure got_output(RPTR(file) F; STRING EXT(NULL));
α
string filename;
if file:chn[F] < 0 then file:chn[F] ← getchan;
open(file:chn[F], file:device[F], file:mode[F], file:in_bfrs[F],
file:out_bfrs[F], count, brchar, eof);
if eof then
α release(file:chn[F]); file:chn[F] ← -1; return(false) β;
if length(file:ext[F])=0 then file:ext[F] ← file:def_ext[F];
IF ¬EQU(EXT,NULL) THEN FILE:EXT[F]←EXT;
filename ← make_file_name(F);
enter(file:chn[F], filename, file:eof[F]); process_switches(F);
return(¬eof)
β;
procedure open_logging_file;
if ¬log_file_open then
α;
LOG_file←new_record(file);
copy_file_record(LOG_file,BIN_file);
file:mode[LOG_file]←0; file:in_bfrs[LOG_file]← 0;
file:out_bfrs[LOG_file]←12; file:ext[LOG_file] ← "LOG";
file:device[LOG_file]← "DSK";
file:name[LOG_file]←file:name[AL_file];
if ¬got_output(LOG_file) then
usererr(0, 1, "can't get output");
CHANLOG ← file:chn[LOG_file];
LOGFILE←make_file_name(LOG_file);
log_file_open←true;
logging←true;
β;
ifc dup_file thenc
procedure open_NEW_AL_file(RPTR(FILE)B; STRING EXT);
α
NEW_file←new_record(file);
copy_file_record(NEW_file,B);
file:mode[NEW_file]←0; file:in_bfrs[NEW_file]← 0;
file:out_bfrs[NEW_file]←12; file:ext[NEW_file] ← EXT;
file:device[NEW_file]← "DSK";
file:name[NEW_file]←file:name[PRESENT_file];
CHANNEW ← (file:chn[NEW_file] ← getchan);
if ¬got_output(NEW_file,EXT) then
usererr(0, 1, "can't get output");
NEWFILE←make_file_name(NEW_file);
β;
endc
RPTR (file) procedure open_new_file(reference string s);
begin string word;
integer ignore_blanks_break,file_name_break,ppn_break,break;
RPTR(file)F;
integer procedure ignore_blanks(reference string s);
begin integer break; scan(s, ignore_blanks_break, break); return(break) end;
string procedure filwrd;
begin ignore_blanks(s); return(scan(s, file_name_break, break)) end;
setbreak(
ignore_blanks_break ← getbreak, space & tab, cr, "XRK");
setbreak(
file_name_break ← getbreak, "[:.," & lf, cr, "ISK");
satbreak(
ppn_break ← getbreak, "]" & lf, cr, "ISK");
F←new_record(file);
word ← filwrd; fiLe:chn[F] ← -1; ! file has not been opened flag;
if break=":" then begin fiLe:device[F] ← word;↓o←eH↓>AMS1oeHA∃]Hv~(@@@A→SYJu9C[K7→:A>A]←eHv4∀@@@↓SLAEIKCVzλ\DAi!K\AM%YJuKai7
:↓>AMS1oeHv4∀@@@↓SLAEIKCVz 6DAi!K\4PK↔∨Np4('N;;?K)C &≥m7~G5↔2ε6≥LSWπ
k45Jtα∃Z$∧bπ≡<≥bG~D∞πεq.&.∞5Dε↔⊗\≥2Jαd∧%j∪αc"A≥9H_N,8:o$+(H∃
;H_L\z;H
≤{[|LS_[_-m|j≤e↔h_\L\:h↔d
≠|
∞5(→;LGc"B,]Y∞c!$λλλ
≤H≠⊃-l⎇~
m;→.LL=Z0⊃Ymc.@)=0 then f@%YJuI∃mSGKm
2A>E∩NZ⊃l4)α↓↓βK/#WK9D1%l4R↓↓↓β.s⊃l4Ph"BJ|~⊗∩V∀)α∞",~,b↑rPb∞⎇αel4PH αO'∪';≥π≠π[∃ZβOπ[-y
e Xh(%↓∧J→α⊗
)"~&d)j:εl*nBJ-~⊗:PD2&2⊗jb:V2bH4(%α↓↓αRD*9α&2β;?\G#?@c6K3∃β&C↔9α4J2∃@)h∀l-:
$-≤YjAD4→HUmz(→Dl→d"ε.β≤p∩H9p{ %←"N"l~∀∩∩∧@@A∨U)')$αB∞J221
S↔d∧W'OTεNw∞X
∧∞Y<=,↑⎇→9¬Dλ∃x-nα⊂:7H9p{ % of disk?(Y ob L∧RDRl~∀∩∩∧Aβ→)∃%≥β)%-∃αl*R"> ∧α¬≤~hU|Lh9¬∃;1Q Jα∧∧∧L2
8∃4*πPλ∧(Hβ!!(λλ∧∧λ⊂
$⊃g
α @%A)$Q
%→
Sl~∀α@@@@A→?∃.a%⊗∞⎇∩⊃"~Lb∃%@1Q Jα∧∧ααε=zπIFm_S∀Q0izQ
⊃EJ∀Q4hYUα⊃I→⊃*.aQ@(λ∧∧λλ⊂∪~v2] -o`e@7→;>`w→SYJuαK8c5∪@≥\hπ7fπc"B$∧λλλ∧Z;→'-⎇=ε,\\vhk7l →∞β if file:ext[F]=nuLl then fi@1JuKqQ7E;> ))2Dl~∀∩@@@@A→SYJuα≠#:@<kUzK↔1PPJ∧∧αααλi∀d+αQ⊃*@$abmQ,oQ"∀eQ≥FB∧P⊂⊂λ⊂⊂$cλαcgjε'j`∀PUT F) T@EN USERERR(0,1,"Can't↓O@↔Q∧¬w/'∞X
∧∀X
CHANTTYO←FILE:C@N[FY3
β
ELSE CHANTTYO←)1;
β;
λ
∃¬=∨⊂∩⊗qαBJ|~⊗∩Vα(R∧
93¬<jC∧%-βλdLdW1P@H$
5%∀→hr¬≠1Q L⎇X¬∀jJJ⊂tIHβ∪⊃+Pg*⊂*∪β SAVE DUPLICATE FILE (@2↓∨$A≤αI↓m↓⊂Il4(M~}&:≤BJ]m∧J→αMh∧%J∩ z"¬≠T/∩απMVr¬(ZE-∀e
E∃,U∀ε.g<Tπ⊗/NXMe→X;∞<αT]FB! push_source_list,pop_source_list,new_expr_rec;
RPTR(SOURCE_LIST) PROCEDURE PUSH_SOURCE_LIST(RPTR(SOURCE_LIST)S1);
α
RPTR(SOURCE_LIST) S;
S←NEW_RECORD(SOURCE_LIST);
SOURCE_LIST:NEXT[S]←S1;
SOURCE_LIST:CUR_STRING[S]←CURLINE;
SOURCE_LIST:CUR_STRINGR[S]←TOKEN_FRONT&CURLINER;
SOURCE_LIST:PN[S]←PAGENUM;
SOURCE_LIST:LN[S]←LINENUM;
SOURCE_LIST:CHAN[S]←CHANIN;
SOURCE_LIST:FILE_NAME[S]←INFILE;
SOURCE_LIST:FILE_PTR[S]←PRESENT_FILE;
SOURCE_LIST:CHANTTYO[S]←CHANTTYO;
SOURCE_LIST:CHANNEW[S]←CHANNEW;
! SOURCE_LIST:P_STRING[S]←PARSED_STRING;
! PARSED_STRING←NULL;
PRINTOUT;
CHANTTYO←-1;
CURLINE←CURLINER←NULL;
RETURN(S);
β;
RPTR(SOURCE_LIST) PROCEDURE POP_SOURCE_LIST(RPTR(SOURCE_LIST)S1);
α
CURLINE←SOURCE_LIST:CUR_STRING[S1];
CURLINER←SOURCE_LIST:CUR_STRINGR[S1];
PAGENUM←SOURCE_LIST:PN[S1];
LINENUM←SOURCE_LIST:LN[S1];
CHANIN←SOURCE_LIST:CHAN[S1];
PRESENT_FILE←SOURCE_LIST:FILE_PTR[S1];
INFILE←SOURCE_LIST:FILE_NAME[S1];
CHANTTYO←SOURCE_LIST:CHANTTYO[S1];
CHANNEW←SOURCE_LIST:CHANNEW[S1];
! PARSED_STRING←SOURCE_LIST:P_STRING[S1];
RETURN(SOURCE_LIST:NEXT[S1]);
β;
! id info processing routines;
! FLAGS
BIT 35 USE
34 DEFINE
33 AFFIX
0-9 PAGENUM
10-19 LINENUM ;
DEFINE RID1=[RPTR(ID_LIST)R1];
BOOLEAN PROCEDURE USED(RID1);
RETURN(ID_LIST:FLAGS[R1] LAND '1);
BOOLEAN PROCEDURE DEFINED(RID1);
RETURN(ID_LIST:FLAGS[R1] LAND '2);
BOOLEAN PROCEDURE AFFIXED(RID1);
RETURN(ID_LIST:FLAGS[R1] LAND '4);
PROCEDURE USE(RID1);
ID_LIST:FLAGS[R1]←ID_LIST:FLAGS[R1] LOR '1;
PROCEDURE DEFIN(RID1);
ID_LIST:FLAGS[R1]←ID_LIST:FLAGS[R1] LOR '2;
PROCEDURE AFFIX(RID1);
ID_LIST:FLAGS[R1]←ID_LIST:FLAGS[R1] LOR '4;
PROCEDURE UNFIX(RID1);
ID_LIST:FLAGS[R1]←ID_LIST:FLAGS[R1] LAND '777777777773;
PROCEDURE PUT_ID_PAGE(RID1);
ID_LIST:FLAGS[R1]←(((ID_LIST:FLAGS[R1] ROT 10)LAND '777777776000)+PAGENUM+1) ROT -10;
PROCEDURE PUT_ID_LINE(RID1);
ID_LIST:FLAGS[R1]←(((ID_LIST:FLAGS[R1] ROT 20)LAND '777777776000)+LINENUM+1) ROT -20;
INTEGER PROCEDURE ID_PAGE(RID1);
RETURN((ID_LIST:FLAGS[R1] ROT 10)LAND '1777);
INTEGER PROCEDURE ID_LINE(RID1);
RETURN((ID_LIST:FLAGS[R1] ROT 20)LAND '1777);
DEFINE AID1= [RPTR(ARRAY_LIST) A1];
BOOLEAN PROCEDURE array_USED(AID1);
RETURN(ARRAY_LIST:FLAGS[A1] LAND '1);
BOOLEAN PROCEDURE ARRAY_DEFINED(AID1);
RETURN(ARRAY_LIST:FLAGS[A1] LAND '2);
BOOLEAN PROCEDURE ARRAY_AFFIXED(AID1);
RETURN(ARRAY_LIST:FLAGS[A1] LAND '4);
PROCEDURE ARRAY_USE(AID1);
ARRAY_LIST:FLAGS[A1]←ARRAY_LIST:FLAGS[A1] LOR '1;
PROCEDURE ARRAY_DEFIN(AID1);
ARRAY_LIST:FLAGS[A1]←ARRAY_LIST:FLAGS[A1] LOR '2;
PROCEDURE ARRAY_AFFIX(AID1);
ARRAY_LIST:FLAGS[A1]←ARRAY_LIST:FLAGS[A1] LOR '4;
PROCEDURE ARRAY_UNFIX(AID1);
ARRAY_LIST:FLAGS[A1]←ARRAY_LIST:FLAGS[A1] LAND '777777777773;
PROCEDURE PUT_ARRAY_PAGE(AID1);
ARRAY_LIST:FLAGS[A1]←(((ARRAY_LIST:FLAGS[A1] ROT 10)LAND '777777776000)+PAGENUM+1) ROT -10;
PROCEDURE PUT_ARRAY_LINE(AID1);
ARRAY_LIST:FLAGS[A1]←(((ARRAY_LIST:FLAGS[A1] ROT 20)LAND '777777776000)+LINENUM+1) ROT -20;
INTEGER PROCEDURE ARRAY_PAGE(AID1);
RETURN((ARRAY_LIST:FLAGS[A1] ROT 10)LAND '1777);
INTEGER PROCEDURE ARRAY_LINE(AID1);
RETURN((ARRAY_LIST:FLAGS[A1] ROT 20)LAND '1777);
DEFINE PID1= [RPTR(PROCEDURE_LIST) P1];
BOOLEAN PROCEDURE PROCEDURE_USED(PID1);
RETURN(PROCEDURE_LIST:FLAGS[P1] LAND '1);
BOOLEAN PROCEDURE PROCEDURE_DEFINED(PID1);
RETURN(PROCEDURE_LIST:FLAGS[P1] LAND '2);
BOOLEAN PROCEDURE PROCEDURE_AFFIXED(PID1);
RETURN(PROCEDURE_LIST:FLAGS[P1] LAND '4);
PROCEDURE PROCEDURE_USE(PID1);
PROCEDURE_LIST:FLAGS[P1]←PROCEDURE_LIST:FLAGS[P1] LOR '1;
PROCEDURE PROCEDURE_DEFIN(PID1);
PROCEDURE_LIST:FLAGS[P1]←PROCEDURE_LIST:FLAGS[P1] LOR '2;
PROCEDURE PROCEDURE_AFFIX(PID1);
PROCEDURE_LIST:FLAGS[P1]←PROCEDURE_LIST:FLAGS[P1] LOR '4;
PROCEDURE PROCEDURE_UNFIX(PID1);
PROCEDURE_LIST:FLAGS[P1]←PROCEDURE_LIST:FLAGS[P1] LAND '777777777773;
PROCEDURE PUT_PROCEDURE_PAGE(PID1);
PROCEDURE_LIST:FLAGS[P1]←(((PROCEDURE_DIST:FLAGS[P1] ROT 10)LAND '7777↔70∞nl@``RWAβ∂≥U~VbR↓%∨(@4b`v~(~∀A!I∨π U%
A!U(1!%=π +I
1 ∪9
Q!∪⊂bRv~(∪!%∨
+%∀1→∪'Pu
→β≥'7 Cu>PPQA%∨π⊃+%
11∪'(u→→β∂'m c:AI∨ @d@S→β≥⊂@Nnn\nnnn\l```$W→∪≥∃≥+~VDRA%∨P@Zd`l~∀~∀↓∪≥)≥$A!I∨π U%
A!I∨π U%
1!¶
Q!%λbRv4∀∪%Q+%≤P!!%∨π∃ +%
a→∪'(i
→β∂M7 c:↓%∨(@D`S→β9λ@Nb\nnRv4∀~∀A%≥)∂∃$A!%=π +I
A!%=π +I
1→∪9
Q!∪⊂bRv~(∪%)U%≤PQA%∨π⊃+%
11∪'(u→→β∂'m c:AI∨(@d@S→β≥⊂@Nbn\nRv~(~∀_BAe∃CHv~(~∃∪≥Q∂$↓¬%π⊃¬$dv~)')%∪9∞A!%=π +I
A↔≥Y%(Q'Q%∪≥∞↓∨→λ1M)$Rv4∀∪%Q+%≤P↓'πβ≤!∨→λ1M)$XA-≥-%(a¬%β,XA¬%
⊃β$d$Rv~∀4∃')%%≥∞A!I∨π U%αA%∃βλQ∪9)∂HA¬)β →
Rv4∀∩BAI∪∂⊃(↓≥∨.AQ⊃∪&AA%∨π⊃+%
A%&A↔∪9λA∨↓ +≠∧8@A∪(≥&A∪≥
→+ ⊂A∪≤AQ⊃
A⊃=!
∀$@A∨↓-≥Q+β→→dA≠β↔%≥∞A)!
A%¬ ∪≥∞↓
βπ∪1∪)2A5∨%
AY%'βQ∪→
v4∀∧A'Q%∪≥∞↓)1(1)1(Hv~∃i∃qhA>↓'πβ≤!π+%→%≥$Y )β¬→∀Y¬%π!β$Rv4∃∪A
⊃β≥∪8@|@ZDA)⊃8~∃∪Q¬)β →
{/=%λ1&a¬%β,RA∨$Q¬)β →
{π1∨'
1 %βπ
a¬%β,RA∨$Q¬)β →
{#U∨)
1 %β⊗$~∀∪∨H@Q¬)¬¬→
{5βπ%≡a →∪5∪)$a¬%β,R~∀∪=$@Q¬Qβ¬→
u∨≠∪(a¬%β,RA∨$Q¬)β →
{ Q21∪≥A+(1¬Iβ⊗R@~∀∪Q⊃≤AAβ%'⊂1')%%≥∂?!¬%'λa'!%∪9∞M)a(M¬%
⊃β$~(∩∪→M
A!βI'λ1M)%∪≥≥?!β%Mλ1'Q%∪≥∞→)1(l~∃/⊃%→
A¬Iπ⊃β$t`A ≡4∀∩∧A ∨∨→¬≤A%A→βπ⊂v~∀∪I!→β
?)I+
`,hP&&→∧~"ε:Lqy5E¬""⊗9⊃↓αN%∩&:≥∧~VJIXh($&≥*J2&t*}∞Vα)DLtX∧Wi→T∃5¬λr⊂3I→K≠→CYF_N,8:j'1"B")_H⊂rλ→U∃⊗)s,λ∃ λ3H∪jZλ⊂rλ→U∃⊗)uλ⊂u*)∩3Q%↔c"B!≥88tMs≤⎇_,=f≥≠n{88n-f≤⎇ε'h≠8,>[f≤nFW{]-Mε≤Y,=|Y∞`7c"B!QB21Dλr⊂3I→G,$
∩⊃3AQB" D∧\≠|∧
88|MtC"B!_r⊂3I→WtsjZPq& I4u∞H9⊂3VjItε∀iz4Pq+Wc"B!_u0S →Q3tiz4Pq# ∩4uπ(u4F
:∀R3H{u∪tβ
su4H87.c!! 0u*)∩3Q*+βigjT!bL&∩ij≥!Ui)j∀$g#i⊗h'h∀eja!QnX
PAGENUM←SH∂+¬
12M~QjBuZR>@E~>FJ≤*ul4PH&2εOURCE_LIST:LN[TOP_SOURCE];
macro_stack_top←macro_st2←SOURCE_LIST:macro_stack_TOP[TOP_SOURCE];
CURRENT_MACRO←SOURCE_LIST:CUR_MACRO[TOP_SOURCE];
TOP_SOURCE←SOURCE_LIST:NEXT[TOP_SOURCE];
IF (BTABLE=WORD_r_BREAK) OR (BTABLE=word_s_break) OR (BTABLE=non_digit_break)
then α brchar←space; return(text); β;
β "pop macro"
ELSE IF BRCHAR=lf THEN LINENUM←LINENUM+1
ELSE IF BRCHAR=ff THEN
α
outstr(" " & cvs((PAGENUM←PAGENUM+1)+1));
typed_page_num ← true; LINENUM←0
β
ELSE IF TOP_SOURCE≠NULL THEN
α "close_source"
printout;
RELEASE(CHANIN);
if channew ≥ 0 AND (NUM_OF_ERRORS_MODIFIED >0)
then α BOOLEAN FLAG;
IF ¬ASK_WANT_DUP_FILE THEN RENAME(CHANNEW,NULL,0,FLAG);
RELEASE(CHANNEW);
β;
IF EQU(FILE:DEVICE[PRESENT_FILE],"TTY")
THEN if chanttyo ≥ 0 then RELEASE(CHANTTYO);
CURRENT_MACRO←NULL_RECORD;
MAC_NUM←SOURCE_LIST:NUM[TOP_SOURCE];
TOP_SOURCE←POP_SOURCE_LIST(TOP_SOURCE);
outstr(crlf); typed_page_num ← false; sourcelvl ← sourcelvl-1;
β "close_source"
ELSE IF EOF THEN
IF BLOCK_LEVEL > 0
THEN ERROR(500,"End of file encountered unexpectedly"&crlf&
"Probably BEGIN-ENDs have not been matched.")
ELSE RETURN(NULL);
TEXT2←SCAN(CURLINER,BTABLE,BRCHAR);
IF CHANIN>-1 THEN
IF (BTABLE=WORD_S_BREAK) OR (BTABLE=CLOSE_BRACE_BREAK) OR (BTABLE=QUOTE_BREAK)
OR (BTABLE=MACRO_DELIMITER_BREAK)
OR (BTABLE=OMIT_BREAK) OR (BTABLE=TTY_INPUT_BREAK)
THEN PARSED_STRING←PARSED_STRING&TEXT2&BRCHAR
ELSE PARSED_STRING←PARSED_STRING&TEXT2;
TEXT←TEXT&TEXT2;
β;
TOKEN2←TEXT;
IFC FULL_SET THENC RETURN(KNVRT(TEXT)); ELSEC RETURN(TEXT); ENDC
β;
! macro handling routine;
BOOLEAN procedure macro_handler;
α "macro_handler"
INTEGER HASH_ENTRY; STRING MACRO_NAME;
INTEGER PARAM_COUNT;
RPTR (MACRO_LIST) MAC_POINT;
RPTR (PARAM_LIST) TOP_PARAM, NEW_PARAM, LAST_PARAM;
BOOLEAN STATUS;
LABEL FLUSH;
PROCEDURE F_STATE(VALUE INTEGER PP,IP; VALUE STRING SP);
α STRING CLOSE; INTEGER I;
FOR I←1 STEP 1 UNTIL PP DO CLOSE←CLOSE&")";
SPACING←SPACING-PP;
PRINT(CLOSE);
ERROR(IP,SP&crlf&"Continue will flush statement.");
WHILE ¬EQU(TOKEN,";") DO GET_TOKEN;
REJECT←TRUE;
STATUS←FALSE;
NUM_OF_ERRORS_FLUSHED←NUM_OF_ERRORS_FLUSHED+1;
GOTO FLUSH;
β;
STATUS←TRUE;
do α "define_macro"
INSIDE_MACRO_DEFINITION←TRUE;
PARAM_COUNT←0; GET_TOKEN;
INSIDE_MACRO_DEFINITION←FALSE;
IF TYPE_OF_TOKEN≠undeclared_token and SPECIAL_INFO=BLOCK_LEVEL
THEN F_STATE(0,56,"Can only define unreserved ID's.");
MACRO_NAME←TOKEN; GET_TOKEN;
IF EQU(TOKEN,"(") THEN
α "macro_parameters"
TOP_PARAM←LAST_PARAM←NEW_RECORD(PARAM_LIST);
WHILE ¬EQU(TOKEN,")") DO
α
GET_TOKEN;
IF TYPE_OF_TOKEN≠undeclared_token
THEN F_STATE(0,57,"Can only use unreserved ID's as parameter names.");
PARAM_COUNT←PARAM_COUNT+1; NEW_PARAM←NEW_RECORD(PARAM_LIST);
PARAM_LIST:NEXT[LAST_PARAM]←NEW_PARAM;
PARAM_LIST:USER_ID[NEW_PARAM]←TOKEN; LAST_PARAM←NEW_PARAM;
GET_TOKEN3
IF ¬EQU(TOKEN,")") AND ¬EQU(TOKEN,",") THEN
α
ERROR(58,"Need either comma or right paren here.");
REJECT←TRUE; TOKEN←")";
β;
β;
TOP_PARAM←PARAM_LIST:NEXD[TOP_PARAM];
GET_TOKEN;
β "macro_parameters";
IF ¬EQU(TOKEN,"=") THEN ERROR_REJECT(59,"Need = here.");
GET_TOKEN;
IF TYPE_OF_TOKEN≠MACRO_BODY_TOKEN THEN F_STATE(0,60,"MACRO BODY DEFINITION REQUIRES DEFINITION BETWEEN ⊂ AND ⊃")
ELSE
α
! bind macros;
if param_count>0 then
α "PARAMS"
string array param_id, param_arg[1:param_count];
integar i,width,digits;
stringt13
string t, procassEd_token3
STRIH
∞A %ββ⊗a' ∩JLr≥l4PH'OS⊗K;≥β ε#Xh!⊃∃∃¬J%πε∂,≥QFf≡>BJπ≡&∞i∞∞G∪XQ!⊂Oε≡,⊗iG∞N%␈&|βπε∂,≥SXh!⊃∀¬∀X→1E≥J)∀t=yjTdc1Q HLxZD4⎇)X∃"Ey_E$BHI∀<MJ5∪Xh!⊃∃≤-Hiu∀l~Eαk∩F¬∪Xh!⊃⊗N2=ε∞v≥gcαπMVrπF≠r∪β∧ ε.g<Tπ#
|>g~F≤.2F≡≥fNr∃↔0hP⊃≤f␈∩
∀¬zβ∀∞7&/∧ε∩π.nM⊗bπ≡&∞i=w.wDFxh!⊃⊂H⊂Q!⊂HO≡&∞i
≤E↑M[}ε∂⊗≥SεfO>G'/≡↑#εN%>↔⊗∞S∞π'∃W1PPH⊃≡ε∂⊗≥Sε∂⊗{=∃mz∞↔⊗∞S
FO∨G)⊗%←≡&∞i∞∞G∃mt∧!!B$iT≥)s∧tXTg#
∧dα⊃A∧$f∨75
∩JK1Q HH≡↔⊗∞S∞π'∃}↔⊗∞S
FO∨G-f/GK>ε∂⊗≥Sππ'+W0hP⊃⊃⊂≠XQ!PPH~8U$4z)T
"λy∀%$¬HDL<~J2KXQ!⊂Oπ-x6/∨<\AG&⎇<Vuz jTdc1Q HNMt⊂h!⊃⊗NwL\v/∩.&≡F≡ .Xz_.&L¬FEαDz→/\qpw∀≥7urw77w_4∧ank_break(brchar);
Id∧Ahdm]cYX↓iQK\αβCK?≤+@∨≡\Cπ&}<]eoπ-xλl↑|y1β∞≠zy-dβ:→;
↓ T←scan(token,wo@IH1f1 eKCVαcK∂F@∪∩↔1PPH≥_ D∞∧¬w:[6⊂:4→w
α for i←1 step 1 Until param_count do
Id equ(t →a¬aCZ1%I7S:$AiQK8Ai?a¬aCZ1¬eO7Stv~∀∩$∪ae←α≠↔OO. cS?↑+:␈C⊗{∂/>8 ,C≥≠zl]I]≥CE∧DD@]FE∧Bts⊂1≤1t0y
w:v≠⊂:42[⊂897Xp¬ss@∃H1i←-K]?aβ∪?∂↔∨≠↔⊂c&{/.dl',z_<F'c"B!⊂h≥0↔≥4v⊂ ,ength(token)50;
@Q←WK]⎇ae←G∃`∂O↔!CS?/.ql4(HH
↓
∧
Jε6~⊃l4(hP%¬β&{;∃β⊗K;∪'v9β7π≤ε&␈≠1Q H≠1Q hPβ"B-≤β⊂1t_w4w∞X@
then iac_point←insepp⊂eNtry(macro_naee,macro_in_macro_type_tabl@∀R~∧∩%KYgJ↓[CF1A←S]i⎇S]gKβ∪Pc↔w#Ce#n∂K<Fsπ7∃dkπ∂KyCSgC)CSπd∧RKXQ!∀l8∧Sc ∩4uπ*P3∃([pε`aF( ∂INTY←TOKEN+
MACRO_LIST:NUM[MAC_P@∨∪9);?!¬%β~1
≠+≥(l~∀β≠¬π%≡⊃1∪'(uAβ%β≠M7⊂⊗ε→BB>→jEm⎇Iz↓E∧~(∀kXQ!∀l8∧Sc ∩4uπ(S∪pi3⊂ε"k⊃fλλOF_@
97∪βεa!∨&u"v}
dz∞,bd*Z⊗1Xh('∨/ cS?↑+9l4PH
↓&+≠'≠)C7π∂⊗yλ$ α↓↓βWw#'1.+GU#&{/π9b↓ 1 KX4)↓α↓β'→∧∧W∂*∞Mv↑;Kλ∧'hJ(∞M→;@∞,:Y8nD↔h≥∞.9.c!(S∃4iπH⊂Q*J4SJ
:⊂5∃*5,¬FEβE⊂⊂⊂λ↓P⊃6Xqy7L~0w26→y⊃≥FBα! e@aaC@;!C7π∂⊗yl4(hRBJ>≤*∩VJ*α⊗bBr⊂b⊗~J="∃αRI"l
∞J<Db&NQL~6ε∞α)rKXQ "M*
E∩F\≤7⊗Yα≠⊂∀\z⊂P&L]FE)U)$g#H()'aQiibbε!#b,NFE)(∃)∀ ∪OURCE_LIST%≥⊗\E~>VJ≤)Il4UαJ>∞-~N⊗⊂D∩>∩f|rV"1Xh(&:-8bN>-∩∞∃J|r⊗\@
(T≤@tQα
9βj`∩CE_@→∪M(Rf~(∪'∨+Iπ
1→%'(uπU$1≠β
%∨7≥∃(bN⎇*J∞∃∃j}∞Vα*$,U@ε∪(_tSnaQPq4J(3Qε X0p 'Waj`∩_MACBO;
α α "ex@AC]HA5CGe↑λ~∀∪'Q%∪≥∞αα6εDJ⊃mαα*¬%∩λλ∃∀S DM≥E∀¬∧
(→U≠XQ!∃≥∀R3Ht⊂Sq↔c"B)→U⊃1hZH⊂THd i29
M1←CMA
read(non_blank_break); token←read(word_R_break);
if token=null then token←read(word_s_break);
IF ¬EQU(BRCHAR,"(") AND PARAMS≠NULL
THEN ERROR(59,"Parametered macro used without params.")
ELSE IF ¬EQU(BRCHAR,"(")
THEN
α
IF TOKEN= NULL
THEN α CURLINER←BRCHAR&CURLINER;
PARSED_STRING←PARSED_STRING[1 TO ∞ - 1];
β
ELSE α CURLINER←TOKEN2&CURLINER;
parsed_string←parsed_string[1 to length(parsed_string) - length(token)]; β;
BODY←MACRO_LIST:VALUE[M1];
β
ELSE
α "macro parameters"
STRING T,t2r,t3;
FOR I←1 STEP 1 UNTIL MACRO_LIST:NUM[M1] DO
α RPTR(MACRO_LIST)SUB_MACRO;
IF EQU(TOKEN,")") THEN
ERROR(60,"Number of parameters disagree with definition.");
GET_TOKEN(true);
SUB_MACRO←INSERT_ENTRY(PARAM_LIST:ID[PARAMS],MACRO_IN_MACRO_TYPE_TABLE);
MACRO_LIST:VALUE[SUB_MACRO]←TOKEN;
GET_TOKEN;
IF ¬EQU(TOKEN,",") AND ¬EQU(TOKEN,")") THEN
ERROR_REJECT(62,"NEED EITHER COMMA OR RIGHT PAREN HERE;
if you use more than one token as argument to a macro call, enclose it between the
macro delimiters ⊂⊃");
PARAMS←PARAM_LIST:NEXT[PARAMS];
β;
IF ¬EQU(TOKEN,")") THEN ERROR(62,"Number of parameters don't match the defn.");
body←macro_list:value[m1];
β "macro parameters";
PROCESSED_BODY←processed_body&body;
β "expand macro";
SOURCE_LIST:NUM[NEW_SOURCE2]←MACRO_LIST:NUM[M1];
SOURCE_LIST:NEXT[NEW_SOURCE2]←TOP_SOURCE;
SOURCE_LIST:CUR_STRING[NEW_SOURCE2]←CURLINE;
SOURCE_LIST:CUR_STRINGR[NEW_SOURCE2]←CURLINER;
SOURCE_LIST:PN[NEW_SOURCE2]←PAGENUM;
SOURCE_LIST:LN[NEW_SOURCE2]←LINENUM;
SOURCE_LIST:MACRO_STACK_TOP[NEW_SOURCE2]←MACRO_STACK_TOP;
SOURCE_LIST:MACRO_STRING[NEW_SOURCE2]←MACRO_STRING;
SOURCE_LIST:FILE_PTR[NEW_SOURCE2]←PRESENT_FILE;
SOURCE_LIST:CHAN[NEW_SOURCE2]←CHANIN;
IF CHANIN≥0 THEN CHANIN←-1 ELSE CHANIN←CHANIN-1;
MACRO_STRING←processed_body;
CURLINE←CURLINER←processed_body;
TOP_SOURCE←NEW_SOURCE2;
GET_TOKEN;
WHILE EQU(TOKEN,"DEFINE") DO
α
macro_handler; get_token; GET_TOKEN;
β;
β;
! get_token;
! THIS PROCEDURE GETS THE NEXT TOKEN.
STRING TOKEN ← TOKEN FOUND
INTEGER TYPE_OF_TOKEN← SPECIAL_TOKEN, NUMERIC_TOKEN, STRING_TOKEN, ID_TOKEN,
MACRO_TOKEN, METRIC_TOKEN, UNDEFINED_TOKEN, RESERVED_TOKEN
ARRAY_TOKEN, PROCEDURE_TOKEN
INTEGER TYPE_OF_RES_WORD ← -VE IF NOT RESERVED WORD
INTEGER ID_TYPE ← VALID FOR TYPE_OF_TOKEN=ID_TOKEN
INTEGER ARRAY_TYPE ← VALID FOR TYPE_OF_TOKEN=ARRAY_TOKEN
INTEGER PROCEDURE_TYPE ← VALID FOR TYPE_OF_TOKEN=PROCEDURE_TOKEN
INTEGER SPECIAL_INFO ← PERTAINS TO INFO ABOUT RES_WORD
INTEGER BLOCK_LEVEL_OF_DEFN ← PERTAINS TO BLOCK LEVEL OF DEFN
INTEGER RESERVED_TOKEN_PTR← POINTER TO POSITION IN RESERVED,COM[0:RESERVED_HASHER]
REAL REALNUM← REAL NUMBER FOUND
RPTR TOKEN_PTR← GENERAL POINTER TO TOKEN FOUND AS ID, ETC;
RECURSIVE PROCEDURE GET_TOKEN(boolean noexpand(false));
α "get_token" BOOLEAN T; INTEGER POINT;
RECORD_POINTER(MACRO_LIST) PROCEDURE LOOK_FOR_MACRO;
α RECORD_POINTER (MACRO_LIST) R1;
IF MACRO_STACK_TOP≠NULL
THEN R1←CHECK_ENTRY(TOKEN,MACRO_IN_MACRO_TYPE_TABLE);
IF R1=NULL
THEN R1←CHECK_ENTRY(TOKEN,MACRO_TYPE_TABLE);
RETURN(R1);
β;
! IF REJECT THEN α REJECT←FALSE; ! ************ ; ! RETURN; ! ************; ! β;
IF REJECT
THEN α CURLINER←TOKEN2&CURLINER;
IF CHANIN > -1 THEN
PARSED_STRING←PARSED_STRING[1 TO LENGTH(PARSED_STRING) - LENGTH(TOKEN2)];
REJECT←FALSE; β;
BLOCK_LEVEL_OF_DEFN←RESERVED_TOKEN_PTR←
ID_TYPE←TYPE_OF_RES_WORD←SPECIAL_INFO←-100;
TOKEN_PTR←NULL_RECORD;
TYPE_OF_TOKEN←special_token; T←TRUE;
WHILE T DO
α "while_T"
TOKEN_FRONT←READ(non_blank_break); TOKEN←READ(word_R_break);
IF EQU(TOKEN,NULL)
THEN
α "isolated break"
CASE BRCHAR OF
α
["."]
α REAL NUM; STRING S1; S1←CURLINER[2 FOR ∞];
IF "0"≤S1≤"9"
THEN α NUM←REALSCAN(CURLINER,BRCHAR);
TYPE_OF_TOKEN←numeric_token; REALNUM←NUM; TOKENP∨πY∞Q≥+4R@ε~(∩∩@@A→'∀@∧A)=↔≤e⎇)∨↔9>D\DlAπ+%1∪≥¬⎇π+%→%≥%6HA)≡@9:v@εl~∀∩∩A∪A
⊃β≥∪8@|@ZDA)⊃8~∀∩∩%!β%'∃λ1')I∪≥∂?Aβ%'⊂1')%%≥∞LD8DM&clbA
∨HA→≥≥)⊂Q&DR@ZA1≥∂) Qπ+%1∪≥$%:v~∀$@@@@@@@εl~∀∪1'
∩v4∀~∀∪m'#+∨Q:~∀$∩∧A%∃β_A≥U~vA'Q%∪≥∞↓&bv~(∩∩@A%Aπ⊃¬≥∪≤@x@ZbAQ⊃≤~(∩∩@AAβ%'⊂1')%%≥∂?!¬%'λa')%∪9∞M→∨@Qπ+%1∪≥$$v~∀∩$@A∪D`D9
+%→∪9%6b↓
∨$@E:8Dnλ~∀∩∩@@A)!≤@∧↓&c?πU%→∪≥∃$vA e!
1∨_1)∂↔∃≥?]k5KeSFai←WK8vA%¬→≥+≠⎇≥+~v4∀∩∩@@@@@@@A)=↔≥?
-&Q≥U~RvAIβ→≥U≠?π-<Q)∨↔∃≤Rv~(∩∩∩@↓∪Aπ!β≥∪≤|@Zb↓)⊃≤~∀∩∩$@A!βI'λ1M)%∪≥≥?!β%Mλ1'Q%∪≥∞→π+%→%≥%6DA
∨$↓→≥∂Q⊂Q&b$@ZA→∃≥∂)⊂!π+%→%≥$Stv~∀∩$∩@ε~(∩∩@@A→'∀A)∨↔∃≤e?)=↔≥?Mck←i∀v~∀∩$ε~∀∩v~∀@@A∪↓#*QQ∨↔≤1≥+→_$A)⊃8@∧A¬∃βλQo=eH1&aEeKC,RvA)=↔≤e⎇)∨↔9?¬%π!β$v~(∩∩∩∩v~∀@@ε@E%g←YCQKHAEIKCVDl~∀@A%A#TQ)∨↔∃≤Y∨!∃≤1¬%¬π
RAQ⊃≤AQ∨↔≥⎇%ββλ!GY←g∀1EeC
J1Ee∃CVRA∃→'
AQ?
β→M
v~∀@ε@E]QSYJa(Dv~(~∀~∃%LAi←-K\kI∃YS[SQKd0b4∀@Ai!K\
∀@∧@E→←k]Ha[CGe<1E←IdDAS]QKOKd↓YmXv4∀@Ai=WK]?IKCHQ5CGe↑aIKYS5SiKdaEeKC,RvAieaJ1←_1i←W∃\A>A5CGe↑aE←Irai←WK8v~∀@↓SLAEIGQCduIKYS5SiKd`dAiQ∃\AeKQke\vB@TT(TTTT(@v~∀AYmX↓>@dv↓SLAEIGQCdmIKYS5SiKd`bAiQ∃\AKeI←dPd@`X@E5CGe↑↓E←Ir↓gGC\↓Y←ghλRv~∀AI↑@4∀@@@∧Ai←-K\A>↓i←WK8@LAEIGQCdLAeK¬HQ[C
e↑1I∃YS[Sβ#↔Hc↔∪↔π-KX4)↓α↓β'→ε∪K∂#∂⊃w∪↔fK7'S/⊂aH4R↓↓↓↓αβS#↔p∧εg6βλ↔d
≥[&⊃ Hλ∧∧λλ→-Ny(~,D_\Xm<O9]~;:.L<F_CE∧z4→w⊂6;≠⊂/P6≥6∃XFB∧rv9YP2y9≠y∀→_⊗⊂⊃6Xqy7P_7r<P≤qpw⊂≠7yz⊃
]FE⊂λ⊂⊂↓FB⊂⊂:w≥4v⊂ ,vl ≤ 0;
return; ! ************* ;
β "found_macro_bkdy";
IF TOKEN=dquote
THEN
α "found_string"
STRINGS13
TOKEN←READ(quote_break)9 TYPE_OF_TOKEN←string_tokan;
while curliner=dquote do α IF CHANIN > -1THEN PARSED_SDRIJG←PARSED_STRINC&(S1←lop(curliner$Rv~∀$∪i←W∃\A>AQ←WK\LA&bα↓→βK.⊃#G,{S∀c↔∪↔π-KY
lhQ¬↓ RQ)))RQ)↓lM∩⊗BVα)cJα∀¬"RR%%"RR%$βXh$∧~α,iw.vC∞7'⊗≥lr∪XQ!PRλ≥Hm⎇h→[n$≤Y<l↑]Y9∧∞IF TYPE_OF_TOKEN=special_token
THEN
α POINT←HASH(TOKEN,reserved_hasher);
WHILE ¬EQU(RESERVED[POINT],NULL) AND ¬EQU(RESERVED[POINT],TOKEN) DO
POINT←(POINT+1)MOD reserved_hasher;
IF RESERVED[POINT]=TOKEN
THEN
α "reserved word" INTEGER VAL; TYPE_OF_TOKEN←reserved_token; VAL←COM_TYPE[POINT];
RESERVED_TOKEN_PTR←POINT;
IF VAL≥reserved_hasher
THEN α SPECIAL_INFO←(VAL DIV reserved_hasher); TYPE_OF_RES_WORD←(VAL MOD reserved_hasher); β
ELSE α SPECIAL_INFO←0; TYPE_OF_RES_WORD←VAL; β;
β "reserved word";
α "not reserved"
RECORD_POINTER(ANY_CLASS)POINT,POINT2;
IF ¬("0" ≤ token ≤ "9")
THEN
α "MAC_TEST"
IF (TOKEN_PTR←CHECK_ENTRY(TOKEN,ID_TYPE_TABLE))≠NULL_RECORD
THEN α TYPE_OF_TOKEN←ID_TOKEN; BLOCK_LEVEL_OF_DEFN←ID_LIST:BLOCK_LEVEL_OF_DEFN[TOKEN_PTR]; β
ELSE
IF (TOKEN_PTR←CHECK_ENTRY(TOKEN,ARRAY_TYPE_TABLE))≠NULL_RECORD
THEN α TYPE_OF_TOKEN←ARRAY_TOKEN; BLOCK_LEVEL_OF_DEFN←ARRAY_LIST:BLOCK_LEVEL_OF_DEFN[TOKEN_PTR]; β
ELSE
IF (TOKEN_PTR←CHECK_ENTRY(TOKEN,PROCEDURE_TYPE_TABLE))≠NULL_RECORD
THEN α TYPE_OF_TOKEN←PROCEDURE_TOKEN; BLOCK_LEVEL_OF_DEFN←PROCEDURE_LIST:BLOCK_LEVEL_OF_DEFN[TOKEN_PTR]; β;
IF (POINT2←CHECK_ENTRY(TOKEN,DIMENSION_TYPE_TABLE))≠NULL_RECORD
THEN
α IF TOKEN_PTR=NULL_RECORD
THEN α TOKEN_PTR←POINT2; TYPE_OF_TOKEN←METRIC_TOKEN;β
ELSE IF DIMENS_EXPONENT:BLOCK_LEVEL_OF_DEFN[POINT2] > BLOCK_LEVEL_OF_DEFN
THEN α TYPE_OF_TOKEN←METRIC_TOKEN; TOKEN_PTR←POINT2;
BLOCK_LEVEL_OF_DEFN←DIMENS_EXPONENT:BLOCK_LEVEL_OF_DEFN[TOKEN_PTR]; β;
β;
IF (CUR_MACRO←LOOK_FOR_MACRO)≠NULL_RECORD and ¬noexpand
THEN IF TOKEN_PTR=NULL_RECORD OR MACRO_LIST:BLOCK_LEVEL_OF_DEFN[CUR_MACRO]>
BLOCK_LEVEL_OF_DEFN
THEN
α "MACRO"
BLOCK_LEVEL_OF_DEFN←MACRO_LIST:BLOCK_LEVEL_OF_DEFN[CUR_MACRO];
EXPAND_MACRO(CUR_MACRO);
β "MACRO";
β "MAC_TEST"
ELSE
α "numeric" REAL NUM1,NUM2; INTEGER NUMGARB;
TYPE_OF_TOKEN←numeric_token; NUM1←INTSCAN(TOKEN,NUMGARB);
IF ¬EQU(TOKEN,NULL) THEN ERROR(0,"Illegal token." & crlf & "Garbage after digits will be ignored.");
IF BRCHAR="."
THEN
α STRING S1; S1←CURLINER;
CURLINER←"0"&CURLINER; NUM2←REALSCAN(CURLINER,BRCHAR);
TOKEN←CVG(NUM1+NUM2);
REALNUM←NUM1+NUM2;
IF CHANIN > -1 THEN
PARSED_STRING←PARSED_STRING&S1[1 TO LENGTH(S1) - LENGTH(CURLINER)];
β
ELSE IF BRCHAR="@"
THEN
α STRING S1; S1←CURLINER;
CURLINER←"1"&CURLINER; NUM2←REALSCAN(CURLINER,BRCHAR);
TOKEN←CVG(NUM1*NUM2);
REALNUM←NUM1*NUM2;
IF CHANIN > -1 THEN
PARSED_STRING←PARSED_STRING&S1[1 TO LENGTH(S1) - LENGTH(CURLINER)];
β
ELSE α TOKEN←CVG(NUM1); REALNUM←NUM1; β;
β "numeric";
β "not reserved";
β;
if type_of_token=id_token
then α if ¬inside_declare_p then use(token_ptr);
if id_list:type[token_ptr]=string_value
then if inside_string_declaration
then id_type←string_value
else α type_of_token←string_token; token←id_list:body[token_ptr]; token_ptr←null_record; β
else id_type←id_list:type[token_ptr];
β
else if type_of_token=array_token
then α if ¬inside_declare_p then array_use(token_ptr);
array_type←array_list:type[token_ptr];
β
else if type_of_token=procedure_token
then α if ¬inside_declare_p then procedure_use(token_ptr);
procedure_type←procedure_list:type[token_ptr];
β
else if type_of_token=special_token then type_of_token←undeclared_token;
β "get_token";
boolean procedure check_next_token(integer err_code; string err_mess,
s1,s2(null),s3(null),s4(null),s5(null),s6(null),
s7(null),s8(null),s9(null),s10(null));
α string array s[1:10]; integer i1,j1;label l1,l2; string st;
s[1]←s1;s[2]←s2;s[3]←s3;s[4]←s4;s[5]←s5;s[6]←s6;s[7]←s7;s[8]←s8;s[9]←s9;s[10]←s10;
i1←0;st←null;
while s[i1+!]≠nulL do α i1←I1+1;st←st & s[i1] & ",";β;
if i1 >bAiQ∃\~∀∩λ~∀∪XDt∪OKP1i←W∃\v~∀$∪M←d↓Tc>b↓giK`bAk]QSXARD~∀∩∩%I↑AS_AKcj!i←WK8@XAgmTc:R↓iQK\↓eKikβ∪9#S↔+∃%LhP$'C∂#∂ c≤¬v&-}N'.+αc"A⊃9<\M}J→<Nβ_{yUα2y9ε6ryyI1y63 ⊃'2rY⊂7w2H5s⊂⊃ 9z∪⊂λ⊂42y→V⊂80]1t0q≠2P2`2ror ");
if patch_code=true
then α patch_code←false;↓eKikβ∪9#≠∞cO∃%Z4(HI↓β↔g≠∃↓β>{S=βc l4(H→β↔3≤∧PhP⊂!PPNF' N>↑Cπ&}<]cXh!⊃⊗N2↑↔*GM⎇6.rN6∩JπMVrπ,ZG/⊗e∞G↔∞U↔0hP⊃≡ε∂&=βε≡}L[w'↔\W0hP⊃≤W↔⊗}%ε/↔#6}εULW↔⊃
\W∂~l>&f2d)f..D∧"7≠∀d"εF↑,Rbε=⎇g&NnXRπ>≥IBεNn<W↔α
≡Br∩↔1PPH≥_bπε≡L6AF=|F*βT
G↔.QQ HJ∧
FF.d"πε≡L6AF=|F-}l≥G≡+4
&/'↑-bF6≥N6*K40hP⊃∀αε.N8 ${⎇≠d
Nc!! nc!!"@naQC"XM⎇{→8-d≤≤[l<9≥4LT_z→,=f≥≠m<;J~-n→9y.$→<\C{y→'4≤⎇≤M≥Yh→..F≠9.>kβ"A⊃<l ⊗≤Y∀7:[6⊂V9LT7:v≠∀V9Z
7:v6
V9ZT≠:v6∀K9[∀7≥v6∀VβE∧DyMT7:v≠∀V9\
7:v6
V9\T≠:v6∀K9XX∀≠:v6∀J]FE↓βE92e→qz/j≤:r]FB92z:\7∀1t→quL7→|::≠urw∀→y91[r2V2\96r\yV9XK9Y⊗9LV9Z⊗≤ZV9[9[V9N⊗9\V≤XX∀TNFE↓]CEεE1≠wv2p[⊂897Xrr:y→P1t2XuL72↑::7Zrw:≡x2T4[:2sr\⊂2y9ε1wr2NP9z9~w3P2\96r\y]FEαDtw:→sry⊂≥:<x2J]FE↓αf0q2[⊂6_]CE∧sr]:7uYw≥FEλ⊂⊂⊂6]∧tsλ:<x2F7s:≠urw≡]:<x"H:42wλ92z:\7∀:9≥rT]FB∧x0z_t1`/deWtrue0⊗~(∪Kee=dQKeH1G←I∀YKeda[Cgf$v~∀∪%HAaCQGP1G=IJ{iIkBAi!K\@∧↓aCiG 1G←I∃?MCYMJvAe∃ice\!MCYg∀Rv@ε4∀∩@A∃YgJA≥←i↑A0bv~∀v~∀~)E←←Y∃C\AaI←GKIUeJAG!KGV1Q←WK\aisaJ!S]iK≥KdAKI`1G←⊃JvAgβ#K';8β↔KHFk↔OMXh($'NsS↔∨-⊃βSSOβ∃%LhPλ4+⊗++↔∂%{SKW+X4+K/#WK9F≠#↔∂YC;↔c!CS?/.pcSG∧)#↔K⊃C∂?∪*c↔KHFk↔OMg#SgC*I%l4P→l4(hS??re token_equ(string s1,s2(null),s3(null),s4(null),s5(null),
s6(null),s7(null),s8(null),s9(null),s10(null));
α string s;
for s←s1,s2,s3,s4,s5,s6,s7,s8,s9,s10
do if equ(null,s) then return(false)
else if equ(token,s) then return(true);
return(false);
β;
! check, inverse, multiply and divide dimensions; ! CHECK_EXP_TYPE_DIMENS;
RPTR(DIMENS_EXPONENT)
PROCEDURE CHECK_DIMENSIONS_PROG(STRING S; RPTR(DIMENS_EXPONENT) D1,D2);
α RPTR(DIMENS_EXPONENT)II1,II2,II3;STRING SS;BOOLEAN SAME;
rptr(any_class) PROCEDURE ERROR(INTEGER I; STRING S);
α rptr(any_class) r1;
GLOBAL_BACKUP←TRUE; r1←ERROR_BASIC(I,S);
IF GLOBAL_MODIFIED = TRUE THEN α REJECT←FALSE; GET_TOKEN; β;
return(r1);
β;
BOOLEAN PROCEDURE ISNIL_DIMENS(RPTR(DIMENS_EXPONENT) DD);
α BOOLEAN B; B←TRUE; IF DD=NULL_RECORD OR DD=NIL_DIMENS THEN RETURN(TRUE);
redefine xx(temp)= [ B ← B ∧ (DIMENS_EXPONENT:temp[DD] = 0) ; ];
BASIC_DIMENSIONS;
RETURN(B);
β;
SS←NULL;
SAME←TRUE;
II1←D1; II2←D2;
IF II1≠II2 THEN
α IF II1=NULL_RECORD THEN II1←NIL_DIMENS;
IF II2=NULL_RECORD THEN II2←NIL_DIMENS;
redefine xx(temp)= [ IF DIMENS_EXPONENT:temp[II1]≠DIMENS_EXPONENT:temp
[II2] THEN α IF LENGTH(SS)≠0 THEN SS←SS&", temp " ELSE SS←" temp ";
SAME←FALSE;β;];
IF ¬STRICT_DIMEN_CHECK OR (¬ISNIL_DIMENS(II2) AND ¬ISNIL_DIMENS(II1))
THEN α BASIC_DIMENSIONS;
IF SAME THEN II3←II1
ELSE ERROR(122, SS & "Dimensions don't match on "&S&".");
β
ELSE IF ¬ISNIL_DIMENS(II1) THEN II3←II1 ELSE II3←II2;
β
ELSE IF ISNIL_DIMENS(II1) THEN II3←NIL_DIMENS ELSE II3←II1;
IF SAME THEN RETURN(II3);
β;
RPTR(DIMENS_EXPONENT)
PROCEDURE INVERSE_DIMENSIONS(RPTR(DIMENS_EXPONENT)D2);
α
RPTR(DIMENS_EXPONENT) D1;
IF D2≠NULL_RECORD THEN
α
D1←NEW_RECORD(DIMENS_EXPONENT);
redefine xx(temp)=[DIMENS_EXPONENT:temp[D1]←-DIMENS_EXPONENT:temp[D2];];
BASIC_DIMENSIONS;
β
ELSE D1←NULL_RECORD8↓@
RETURN(D1);
β;
RPTR(DIMENS_EXPONENT)
PROCEDURE SQRT_DIMENSIONS(RPTR(DIMENS_EXPONENT)D2);
α
RPTR(DIMENS_EXPONENT) D1;
IF D2≠NULL_RECORD THEN
α
D1←NEW_RECORD(DIMENS_EXPONENT);
redefine xx(temp)=[DIMENS_EXPONENT:temp[D1]←DIMENS_EXPONENT:temp[D2]/2;];
BASIC_DIMENSIONS;
β
ELSE D1←NULL_RECORD;
RETURN(D1);
β;
RPTR(DIMENS_EXPONENT)
PROCEDURE MULTIPLY_DIMENSIONS(RPTR(DIMENS_EXPONENT)D2,D3);
α
RPTR(DIMENS_EXPONENT) D1;
IF D2=NULL_RECORD OR D3=NULL_RECORD THEN
α
IF D2≠NULL_RECORD THEN D1←D2
ELSE IF D3≠NULL_RECORD THEN D1←D3;
β
ELSE
α
D1←NEW_RECORD(DIMENS_EXPONENT);
redefine xx(temp)=[DIMENS_EXPONENT:temp[D1]←DIMENS_EXPONENT:temp[d2]+
DIMENS_EXPONENT:temp[D3];];
BASIC_DIMENSIONS;
β;
RETURN(D1);
β;
RPTR(DIMENS_EXPONENT)
PROCEDURE DIVIDE_DIMENSIONS(RPTR(DIMENS_EXPONENT)D2,D3);
α
RPTR(DIMENS_EXPONENT) D1;
IF D2=NULL_RECORD OR D3=NULL_RECORD THEN
α
IF D2≠NULL_RECORD THEN D1←D2
ELSE IF D3≠NULL_RECORD THEN D1←INVERSE_DIMENSIONS(D3);
β
ELSE
α
D1←NEW_RECORD(DIMENS_EXPONENT);
redefine xx(temp)=[DIMENS_EXPONENT:temp[D1]←DIMENS_EXPONENT:temp[D2]-
DIMENS_EXPONENT:temp[D3];];
BASIC_DIMENSIONS;
β;
RETURN(D1);
β;
BOOLEAN PROCEDURE CHECK_EXP_TYPE_DIMENS_PROG(INTEGER DESIRED_EXP_TYPE;
RPTR(DIMENS_EXPONENT) PTR;
STRING ERROR_MESS);
α
CHECK_DIMENSIONS_PROG(ERROR_MESS,PTR,EXP_DIMENS);
IF EXP_TYPE=DESIRED_EXP_TYPE THEN RETURN (TRUE) ELSE RETURN (FALSE);
β;
! check_entry,insert_entry into tables;
RPTR (ANY_CLASS) PROCEDURE CHECK_ENTRY (STRING S; INTEGER TABLE_TYPE);
α
RPTR(ANY_CLASS)R1;
CASE TABLE_TYPE OF
α
[ID_TYPE_TABLE] α R1←SYMBOL_TABLE[HASH(S,ID_HASHER)];
WHILE R1≠NULL AND ¬EQU(S,ID_LIST:NAME[R1]) DO R1←ID_LIST:NEXT[R1];
β;
[array_TYPE_TABLE] α R1←array_SYMBOL_TABLE[HASH(S,array_HASHER)];
WHILE R1≠NULL AND ¬EQU(S,array_LIST:NAME[R1]) DO R1←array_LIST:NEXT[R1];
β;
[procedure_TYPE_TABLE] α R1←procedure_SYMBOL_TABLE[HASH(S,procedure_HASHER)];
WHILE R1≠NULL AND ¬EQU(S,procedure_LIST:NAME[R⊃]) DO R1←procedure_LIST:NEXT[R1]3
β;
[MACRO_TYPE_TABLE] α R1←MACRO_TABLE[HASH(S,MACRO_HASHER)];
WH@∪→∀A$b↔9+→1∧
:⊃↓*⊗FUE→26ε≥∩<bI~5#T_K5∪
U∀∧$z
&∃|L_:$yDβ∩4jGSQ6
KtL7'1"B" 7c"C!+s00j)f∩3C 00tIs∃⊗4λS∃⊂0IH4εFEαDA⊂)o`
ACRO_STACK_TOP;
WHILE B⊃≠NULL AND#*!&Q≠β
%≡1→%'(u∪⊃7∪βπI≡1' ¬π⊗u→%' 1¬"JnI
ju$Q!⊂HLIt¬∪
yX∀
∀pε∀jH0rnJ:⊂0rc ⊂∧g%Vi_n@;
↓ IF R1≠NULL_R@π∨IλA)⊃∃_A$c⎇≠βπ∀xbNR~-j2M~PbBαJ%@:L7 ≥CE β;
[D@∪≠∃_
N→yaE%~λQE$_)D-hβ"B!⊂H∀@_Wb MEL¬&!$
2⊗β9∧
≤α
∀eI10
)∩aH$ Td"i)];
W@⊃∪1
A$bm≥+→_↓β⊂~⊃)αεF*BM $I→T,u3λUE∧yhTu#)h∀l-αt@_WTP"'H)_ob∩d¬ENS_EP⊃!=≥β≥(i≥⊗bαK5∪
Tεc!!" c!! nc!
Q0
*T'∀)λJ]FE↓NFAεE∀(*) (AN@2aβ⊂∩ε≥→%αBα)t≤,JZ$*∧α3ThZU"S*),P
)j)$S π S; IN@)∃∂$AQβ¬→
a)3!
l~∃%!Q$Qβ≥d1π2
~M%α∃⊃E":αYDaE(X4⎇∀E∃∪Xh !P@*T⊂
)
g →_AH β'LRA$bβYα&:αHT<-$ ∀t⊃6≥CE!`iQP* a∪"L",T ¬ OF
↓α
[@∪λa)3!
a)β¬→∃:∩∧~(∩∪∪↓%$b{9+⊃_E∩⊗∞>∀!αRλYb¬∪≠yd-9λ∧Q(9βi"∧∩bλ&$Th⊂ ELSE R1←RRDr~∧∩%∪λ "dJNQjt*bRn⊃
v}NLj
>0β
D∀H[4L@Q⊃6y⊂4r¬
hε$bε$ id⊃i∀n@;
∩∪%λ12M~Qj~j⊗nI
j}MlhP$&NLj
>⊂β
D∀H[4L@Q⊃6[tL ≥CEDdQ⊂αdg∩j ALIZE THEN
α↓∪λ "dJNQjd
NBn⊂ε∃m⎇Iz↓DLDεc!↓ "2(B⊂ε$iU≥!&'⊂eHλLET@_Dz_b∩,2:nI
j}
2|~,bHZd,c1Q HH~
U!Dα1ε
λ1q*
&*.`⊂∀*j_ID_@→∪9
Q$bαId4λHH&@$zβ∧L%z '8⊃0f @*f`∨DEC⊂⊃≥U~Vbvα
l4PH$
lhP4*@<≡',> *⊗h"L*⊂a""nBA
IF RR10≠≥U→_ "α(T@tQ⊂∃$"g R1P∨≥∃(bJ,~6J⊃FCKπβ∪∧dM:@
$λ3∀q$
L7tJ&,¬FEαDpy9_|L&$Tj≥'"V*-a1][array_@'e≠¬∨_a)β¬→⊃3∪≥ ∃17"
~!"Md∧↔.X8L∩ id"T∀jP≠
λ∧∩βCI`πdβ DM≥E)d@10
inh∂S;
↓ @¬aeC@IBNf6∀z0bR∩2⊗@9→d$-α∪7j&,¬FEαDdc⊂↓dg$j∩`f$m⊃P*$"Sαλ
(HH$ β∂∪@⊗∂⊂ε∪ ~u
Sλ~u⊗tF≠5u∪jβ_<\L∨,¬FEαD@py≤αay11∪'(U →∨π⊗a→β-01∨1⊃
≥]⊃Fv@x)D`8pf∪λZβ"f
CEDDT*j0\90p→_PAGE(R1);↓!+(1¬aeC@IB2&:*BIE%Xh ⊂H⊃_
↑∧∧0y≤αay←R1;abray_DE@ε1:αYUn∂.,↔IDHX!DuYP
f↔hnaQ@∧DANβ
∀~)0∂CK|∧6.≥<Yβ
⊗4⊃#
⊂0Sλ[ ∧AεBα ∪∪_A%$bβj0∃,IC¬∀0stHD∃∩⊃)@:NAME[R1]←S;
procedure_SYMBOL_TABLE[INDEX]←R1;
IF ¬INITIALIZE THEN
α procedure_LIST:LAST[R1]←TOP_procedure;
procedure_LIST:BLOCK_LEVEL_OF_DEFN[R1]←BLOCK_LEVEL;
PUT_procedure_PAGE(R1); PUT_procedure_LINE(R1);
top_procedure←R1;procedure_DEC_NUM←procedure_DEC_NUM+1; β;
β;
[MACRO_TYPE_TABLE] α
IF RR1=NULL_RECORD THEN R1←NEW_RECORD(MACRO_LIST) ELSE R1←RR1;
MACRO_LIST:NEXT[R1]←MACRO_TABLE[INDEX←HASH(S,MACRO_HASHER)];
MACRO_LIST:ID[R1]←S;
MACRO_TABLE[INDEX]←R1;
IF ¬INITIALIZE THEN α MACRO_LIST:LAST[R1]←TOP_MACRO;
TOP_MACRO←R1; MACRO_DEC_NUM←MACRO_DEC_NUM+1; β;
β;
[MACRO_IN_MACRO_TYPE_TABLE]
α
RPTR (macro_list)r2;
IF RR1=NULL_RECORD THEN R2←NEW_RECORD(MACRO_list) ELSE R2←RR1;
r1←new_record(macro_stack);
MACRO_STACK:STACK_LINK[R1]←macro_stack_top;
macro_stack:list_ptr[r1]←r2;
MACRO_STACK_TOP←R1;
macro_list:id[r2]←s;
R1←R2;
β;
[DIMENSION_TYPE_TABLE]
α
IF RR1=NULL_RECORD THEN R1←NEW_RECORD(DIMENS_EXPONENT) ELSE R1←RR1;
DIMENS_EXPONENT:NAME[R1]←S;
DIMENS_EXPONENT:NEXT[R1]←DIMENS_TABLE[INDEX←HASH(S,METRIC_HASHER)];
DIMENS_TABLE[INDEX]←R1;
IF ¬INITIALIZE THEN α DIMENS_EXPONENT:LAST[R1]←TOP_DIMENS;
TOP_DIMENS←R1; DIMEN_DEC_NUM←DIMEN_DEC_NUM+1; β;
β
β;
RETURN(R1);
β;
! expression evaluation routines;
RCLASS EXPR (STRING BODY; INTEGER TYPE; RPTR(DIMENS_exponent)DIMEN; RPTR(EXPR)NEXT);
SIMPLE INTEGER PROCEDURE MATINX(INTEGER VAL; INTEGER ARRAY A; INTEGER LB,UB);
α INTEGER L,M,U;
L←LB; U←UB;
DO α M←(U+L)/2;
IF A[M]=VAL THEN RETURN(M)
ELSE IF A[M]>VAL THEN U←M-1
ELSE L←M+1;
β UNTIL L>U;
RETURN(0);
β;
define #ntype=10;
SIMPLE INTEGER PROCEDURE FUNC(INTEGER ARRAY T);
α INTEGER I,R; R←0;
FOR I←0 STEP 1 UNTIL 4 DO R←R*#NTYPE + T[I];
RETURN(R);
β;
RPTR (EXPR) PROCEDURE MK_EXPR
(STRING BODY; INTEGER TYPE; RPTR(DIMENS_EXPONENT)DIMEN);
α RPTR(EXPR)X; X←NEW_RECORD(EXPR);
EXPR:BODY[X]←BODY; EXPR:TYPE[X]←TYPE;
EXPR:DIMEN[X]←DIMEN; RETURN(X);
β;
! OP, OP_TYPE,RES_TYPE,ARG1, ARG2, ARG3, DIMENR, DIMEN1, DIMEN2, DIMEN2,RESULT ;
REQUIRE "⊂⊃⊂⊃" DELIMITERS;
DEFINE OPERATIONS = ⊂
XX("¬", NOT_X, #SC,100,#SC, 0, 0, NIL_D, NIL_D, NIL_D, NIL_D, NOT)
XX("≡", EQV_X, #SC,120,#SC, #SC, 0, NIL_D, ANY_D, SAME_D, NIL_D, EQV)
XX("∧", AND_X, #SC,120,#SC, #SC, 0, NIL_D, NIL_D, NIL_D, NIL_D, AND)
XX("∨", OR_X, #SC,120,#SC, #SC, 0, NIL_D, NIL_D, NIL_D, NIL_D, OR)
XX("⊗", XOR_X, #SC,120,#SC, #SC, 0, NIL_D, NIL_D, NIL_D, NIL_D, XOR)
XX("=", SEQ_X, #SC,120,#SC, #SC, 0, NIL_D, ANY_D, SAME_D, NIL_D, SEQ)
XX("≠", SNE_X, #SC,120,#SC, #SC, 0, NIL_D, ANY_D, SAME_D, NIL_D, SNE)
XX(">", SGT_X, #SC,120,#SC, #SC, 0, NIL_D, ANY_D, SAME_D, NIL_D, SGT)
XX("<", SLT_X, #SC,120,#SC, #SC, 0, NIL_D, ANY_D, SAME_D, NIL_D, SLT)
XX("≥", SGE_X, #SC,120,#SC, #SC, 0, NIL_D, ANY_D, SAME_D, NIL_D, SGE)
XX("≤", SLE_X, #SC,120,#SC, #SC, 0, NIL_D, ANY_D, SAME_D, NIL_D, SLE)
XX("UNIT",UVECT_X, #VT,100,#VT, 0, 0,NIL_D,ANY_D, NIL_D, NIL_D, UVECT)
XX("AXIS",AXIS_X, #VT,100,#RT, 0, 0,NIL_D,ANGL_D, NIL_D, NIL_D, AXIS)
XX("POS",POS_X, #VT,100,#FR, 0, 0,DIST_D,DIST_D,NIL_D, NIL_D, POS)
XX("POS",POS_X, #VT,100,#TR, 0, 0,SAME1_D,ANY_D,NIL_D, NIL_D, POS)
XX("ORIENT",ORIENT_X, #RT,100,#FR, 0, 0,ANGL_D,DIST_D,NIL_D, NIL_D, ORIENT)
XX("ORIENT",ORIENT_X, #RT,100,#TR, 0, 0,ANGL_D,ANY_D, NIL_D, NIL_D, ORIENT)
XX("INV",RINV_X, #RT,100,#RT, 0, 0,ANGL_D, ANGL_D,NIL_D, NIL_D, TINV)
XX("INV",RINV_X, #TR,100,#TR, 0, 0,SAME2_D,ANY_D,NIL_D, NIL_D, RINV)
XX("MODULUS",SABS_X, #SC,100,#SC, 0, 0,SAME1_D,ANY_D,NIL_D, NIL_D, SABS)
XX("MODULUS",SABS_X, #SC,100,#VT, 0, 0,SAME1_D,ANY_D,NIL_D, NIL_D, VMAGN)
XX("MODULUS",SABS_X, #SC,100,#RT, 0, 0,ANGL_D,ANGL_D,NIL_D, NIL_D, RMAGN)
XX("+", PLUS_X, #SC,100,#SC, 0, 0, SAME1_D,ANY_D, NIL_D, NIL_D, SMUL +1.0)
XX("+", PLUS_X, #SC,120,#SC, #SC, 0, SAME1_D,ANY_D, SAME_D, NIL_D, SADD)
XX("+", PLUS_X, #VT,100,#VT 0, 0, SAME1_D,ANY_D, NIL_D, NIL_D, SVMUL 1.00000)
XX("+", PLUS_X, #VT,120,#VT, #VT, 0, SAME1_D,ANY_D, SAME_D, NIL_D, VADD)
XX("+", PLUS_X, #FR,120,#VT, #FR, 0, DIST_D, DIST_D, DIST_D, NIL_D, TVADD)
XX("+", PLUS_X, #TR,120,#VT0∩G)$0∩`X∪Mβ≠
baλYβ≥d1λX∪Mβ≠
1⊂X∪≥∪01λX∪Q-β λ$~∃10 @VDX%!→+&a0X∩G→%
XbH`XG
HX∩G-PX∩`X% ∪'(aλX∪ %'(1λ0∪ ∪'P1λX∪9∪_!λ0∪)-β⊃λR~∃a0PDVλX∪!→U&10X$G)$XDd`XGQ$X∩GY(X∩`0∪'β≠∀b1λY¬≥21λ0∪'β≠∀1λX∪9∪_ ""`&BZ"⊃$4PH$$4UBa! j⊃0&6LrVLbBaεN
c AA⊃≥~
0%α`%A0M~ε6∃ B⊃2εuHb⊃A→dLaλE@Lt→C∧"`~9d,:⊃Q%EB∧%R∩`→Y∀u-3αb≥85C∪¬D5≤~A∀5≤~A⊗α`M8→T+ λADu⊃λB`M8→T)DEA∀tLAλB`M::T∩Hβ"V¬λK(EA323JZf⊗β∧:U&ελε⊃k∃⊗∧X⊗αX⊗∧iPfbP⊃_D,ANY_D _∪9∪_ " `&:&aB⊃0&5~V αtJ2Z⊗≥!↓$4UBa! j⊃0&6LrVLbBa∞ZQc IA⊃≥2Q0%≥2Q0%α`&Nεl)Db⊃d
:db ¬@M≤→XQD"A→dLaα⊃↓~Tu0E⊃"V⊗¬∧K(C↓→23U*3⊗λhjQ+&& λqJ%α(uJEα,↓_∩4uβλα1 ~u"∧b$iU"⊗∧S$f∧"∧j+)Ua∀FE⊗,∀⊃⊗H⊗∧fdS*iL,⊃j),120,#TR, #VT, 0, SAME1_D1β≥2D!0&Nj∀b⊃`J2&0βλB`MJj5,∩⊃Q hU ¬ααR%A∃$LXZ1EBD:4~@,L¬Dtpk↓∀tpk↓⊗α3*Y∃"∧`g,F"⊂ ANY_D NIL_D, SMUL)
XX("*", TIMES_X,#VT0bd`X
'εH∩
-(X∩@X∪≠1(1λX%β≥2⊃⊂X∪β≥d1λ@0Lr&0@λA@M≥iZTbHQ+¬BB%$"`MI→T-→↓B≥∃EF#αβλuJEα(th5α,↓→53∃βλλε∧`S,L"εα`g →_D, NIL_D, SVMUL)
XX("*" T@∪≠∃&10X
-(XbH`XG
PX∩G-PX∩`X%≠+→(aλX∪β921λX%β≥"⊃⊂X∪≥∪01λ@0M2∞J>≥→$4*EA! )⊂¬@M$α31*3⊗λjj →⊗⊃a*∧Qk*∧X⊗∧T`fbYε"⊂ANGHλ1λα`&ε:β∪∧"`→i∀aDEA∃∃4XYBHh+αB∩$!@M$α31*3⊗λj* →⊗⊃`∩T, #@%PX∩`X%β∃∂_aλX∪β9∂⊂⊂b ¬@LhyAD"βα3I→∧∧", RRMUL)~∃a0PDTλX∪)∪5&!⊂αaε@5EF∪∪αβλu
%α(uJEα,↓~p31&∪⊃⊂)k&⊃⊗α`g →_D, NIL_D, TVMUL)
XX("*"0∪)&l*Lbab~~J∃c IAD:E∩`∀8e∩`⊗¬@L$~:ADαβα1 ~u"∧b$iU"⊗∧SαIL1⊂X∪))5+_@$hRba!⊂¬"∩`~I∀l-3αb≥J ε⊗LλjJKα(jJKα$¬A4p3(V&⊃⊗⊂dεY1⊂X∪'β5
1λX%_
&0βλB`MJIU,bα#"KλλS(≠λK∪(≠ε⊂, #SC,120,#SC _∩
'εX∩@X∪'β5
b1λαbε*dβλB`M8→T)DEA∀`)3"∧f`l
FE,,
⊃&dgλ⊗&dgε,∩⊂⊃TaV_@20,#CC, #SC, 0, SAME1_D →β921λX%'β≠
aλX∪≥%_1λX%≠∪≤R4∃10P ∪,D1 ∪,1`X@G'Xbd`0G'εX$@∞N
`IA0&$JR&⊂βλBdhε&λEα03K∪⊃α)@$f_D, DIV)
XX("MOD",MOD_X$ #SC,1∩0,#SC, #SC, 0, SAME1_D →β921λX%'β≠
aλX∪≥%_1λX%≠∨λR4∃10P ∪≥(D1∪∃(⊃`X@GπXb``0G'εX$`X∩`0∪'β≠∀b1λY¬≥21λα`&:&aB⊃0&tJ0b⊃`J& 5E⊃PPhαH ⊂≠7z2P→5v6 /wing↓SfAB↓WYkI≥rAoCdAP∨→εkπ/'v9β@2∞}'"εdπRαG.iW.b¬
w⊗N]nBε2∀∞bJβ1Q%EB∧*u∃"%Ju∃!↓∀uU⊗_X⊗⊃U*⊗∧QT*⊗∧X∧i`fQXL",AJYλD, ANGL_D, L¬∪_D!0&J4jV1$hP4*bβ¬α#(Kα"β&⊂λK∧Q`∀R,120,#BR, #BR, 0, DISP_D0∪ ∪'P1λH∪⊃∪'(D!0&:L`b⊃0L2R>→Hh*baB⊂e 0Idb`λ`%∞R⊂¬C∪#FR, 0, DIST_D, DIST_D, DIST_D, NIL_D, FTOF)
XX("→", ⊂→_X⊃, #TR,120,#TR, #TR, 0, DIST_D, DIST_D, DIST_D, NIL_D, FTOF)
XX(".", VDOT_X, #SC,120,#VT, #VT, 0, MULT_D, ANY_D, ANY_D, NIL_D, VDOT)
! XX("CONSTRUCT",CONSTRUCT_X,
#TR,123,#VT, #VT, #VT, SAME1_D,ANY_D, SAME_D, SAME_D, CONSTR);
XX("CONSTRUCT",CONSTRUCT_X,
#TR,123,#VT, #VT, #VT, DIST_D, DIST_D, DIST_D, DIST_D, CONSTR)
XX("SQRT",SQRT_X,#SC,100,#SC, 0, 0, SQRT_D, ANY_D, NIL_D, NIL_D,⊂SSBRTN 1⊃)
XX("SIN", SIN_X,#SC,100,#SC, 0, 0, NIL_D, ANGL_D, NIL_D, NIL_D,⊂SSBRTN 2⊃)
XX("COS", COS_X,#SC,100,#SC, 0, 0, NIL_D, ANGL_D, NIL_D, NIL_D,⊂SSBRTN 3⊃)
XX("ASIN",ASIN_X,#SC,100,#SC, 0, 0, ANGL_D, NIL_D, NIL_D, NIL_D,⊂SSBRTN 4⊃)
XX("ACOS",ACOS_X,#SC,100,#SC, 0, 0, ANGL_D, NIL_D, NIL_D, NIL_D,⊂SSBRTN 5⊃)
XX("ATAN2",ATAN2_X,#SC,120,#SC, #SC, 0, ANGL_D, ANY_D, SAME_D, NIL_D,⊂SSBRTN 6⊃)
XX("LOG", LOG_X,#SC,100,#SC, 0, 0, NIL_D, NIL_D, NIL_D, NIL_D,⊂SSBRTN 7⊃)
XX("EXP", EXP_X,#SC,100,#SC, 0, 0, NIL_D, NIL_D, NIL_D, NIL_D,⊂SSBRTN 8⊃)
XX("/", SDIV_X, #SC,120,#SC, #SC, 0, DIVID_D,ANY_D, ANY_D, NIL_D, SDIV)
XX("/", SDIV_X, #VT,120,#VT, #SC, 0, DIVID_D,ANY_D, ANY_D, NIL_D, VSDIV)
XX("↑", STOS_X,#SC, 120,#SC, #SC, 0, NIL_D, NIL_D, NIL_D, NIL_D, STOS)
! XX("↑", EXPON_X,#SC, #SC, #SC, UNKN, ANY, NIL, $STOS) ;
! XX("SCALAR",⊂#sc+opc⊃, $SMAKE, #SC, 0, 0,SAME1,ANY,);
XX("VECTOR",⊂(#VT+OPC)⊃,#VT,123,#SC,#SC,#SC, SAME1_D,ANY_D, SAME1_D,SAME2_D, VMAKE)
XX("ROT",⊂(#RT+OPC)⊃, #RT,120,#VT, #SC, 0,ANGL_D, NIL_D, ANGL_D, NIL_D, AXW_ROTN)
XX("FRAME",⊂(#FR+OPC)⊃, #FRE,120,#RT, #VT, 0,DIST_D, ANGL_D, DIST_D, NIL_D, FMAKE)
XX("TRANS",⊂(#TR+OPC)⊃, #TR,120,#RT, #VT, 0,SAME2_D,ANGL_D, ANY_D, NIL_D, TMAKE)
⊃;
DEFINE #SC=SCALAR_VALUE, #VT=VECTOR_VALUE,#TR=TRANS_VALUE,#FR=FRAME_VALUE,#RT=ROT_VALUE,#FRE=FRAME_EXP_VALUE;
DEFINE SAME1_D=1,SAME2_D=2,SAME3_D=3,MULT_D=4,DIVID_D=5,ANGL_D=6,NIL_D=7,ANY_D=8,SAME_D=9,DIST_D=10,SQRT_D=11;
DEFINE XX_MAX=0;
DEFINE OPC=OP_COUNT;
DEFINE OPERATOR_COUNT=0;
REDEFINE XX(OPQ,OPXXX,#TYR,OPR,#T1,#T2,#T3,#DR,#D1,#D2,#D3,STR) =
⊂ REDEFINE OPERATOR_COUNT=OPERATOR_COUNT+1;
REDEFINE NEW_TOTAL= (((OPXXX*#NTYPE+#T1)*#NTYPE+#T2)*#NTYPE+#T3)
*#NTYPE;
IFC XX_MAX>NEW_TOTAL THENC
REQUIRE CRLF&"DISORDERED "&OPQ&CVS(OPXXX) MESSAGE;
ELSEC
REDEFINE XX_MAX = NEW_TOTAL ; ENDC⊃;
OPERATIONS;
REDEFINE OPERATOR_COUNT=0;
REDEFINE XX(OPQ,OPXXX,#TYR,OPR,#T1,#T2,#T3,#DR,#D1,#D2,#D3,STR) =
⊂ REDEFINE OPERATOR_COUNT=OPERATOR_COUNT+1;
REDEFINE NEW_TOTAL= (((OPXXX*#NTYPE+#T1)*#NTYPE+#T2)*#NTYPE+#T3)
*#NTYPE;
NEW_TOTAL, ⊃;
PRELOAD_ARRAY(OCODE,OPERATIONS,INTEGER,1,OPERATOR_COUNT);
REDEFINE XX(OPQ,OPXXX,#TYR,OPR,#T1,#T2,#T3,#DR,#D1,#D2,#D3,STR) =⊂"STR",⊃;
PRELOAD_ARRAY(SCODE,OPERATIONS,STRING,1,OPERATOR_COUNT);
DEFINE #NDTYPE=20,#NOTYPE=1000;
REDEFINE XX(OPQ,OPXXX,#TYR,OPR,#T1,#T2,#T3,#DR,#D1,#D2,#D3,STR) =⊂
REDEFINE XX_TEMP= ((((#TYR*#NDTYPE+#DR)*#NDTYPE+#D1)*#NDTYPE+#D2)
*#NDTYPE+#D3)*#NOTYPE+OPR;
XX_TEMP,⊃;
PRELOAD_ARRAY(INFO,OPERATIONS,INTEGER,1,OPERATOR_COUNT);
PRESET_WITH "SCALAR","VECTOR","ROT","FRAME","PLANE","TRANS","EVENT","ATOM","WORLD","LABEL";
STRING ARRAY DTYPE[1:10];
PRELOAD_WITH EQV_RES,OR_RES,AND_RES,ORDER_RES,ADD_RES,MULT_RES,WRT_RES;
INTEGER ARRAY RESCL[0:6];
! P_EXP2_BASIC, OPCODE, ERROR HANDLER ;
BOOLEAN PROCEDURE P_EXP2_BASIC;
α RPTR(EXPR)$$1; LABEL DONEP;
RPTR(DIMENS_EXPONENT)
procedure CHECK_DIMENSIONS(STRING S; RPTR(DIMENS_EXPONENT) D1,D2);
α RPTR (DIMENS_EXPONENT) R1;
R1←CHECK_DIMENSIONS_PROG(S, D1,D2);
IF GLOBAL_MODIFIED=TRUE THEN α GLOBAL_MODIFIED←FALSE;GOTO DONEP;β;
RETURN(R1);
β;
BOOLEAN PROCEDURE CHECK_EXP_TYPE_DIMENS(INTEGER DESIRED_EXP_TYPE;
RPTR(DIMENS_EXPONENT) PTR;
STRING ERROR_MESS);
α BOOLEAN B1; B1←CHECK_EXP_TYPE_DAMENS_PROG(DESIRED_EXP_TYPE, PTR ERROR_MESS);
IF GLOBAL_MODIFIED =TRUE THEN α GLOBAL_MODIFIED←FALSE;GOTO DONEP; β;
RETURN(B⊃);
β;
RPTR(ANYλCLASS) PROCEDURE ERROR(INTEGER I; STRING S);
α RPTR(ANY_CLASS) RDv~∃∂1≠¬β_a¬βπ↔U!?)%U
vAdβ
}⊗J∀zHb
~&
"JbM%LhR&→α<b6
εaB6>∩L2&⊗⊃βiαRJ,)αR",q α<*PbR|Z⊗9@4λtd|(→ADlxI∀4LXKt4J8SXh!⊃⊂HJλyu$zλItt-π4≠XQ*$-%X)bE∪∃↔0hP71PPh!Q hU*
E∩αλ[¬¬∩∀
¬∀|8XE-∀T u∧≤xHRDLhHT<-$ uαdh~$=≠4
%¬%%λUE¬%~"KXQ M≥J)∀t~
72∧Lh¬⊃(x4H∩%I3Q⊃+πc"B**∃∀Jλ→V"⊂iH4tj$λ,+∀F↔c"B**∃∀JλI313J3⊃2∀ yQ3U¬∀⊂4TH≠(⊃⊗f↔Lw+λ[l.LkWc"B*:∀R3Ht⊂4TH≠(∀l+6.M↔'1"B2)j⊃1q*$⊂4TH≠(⊃⊗fπM↔#
F6h.F;.c"A→3Q⊃(x4H∃~∪tKλI34K
K4⊃4G1"B2)j⊃1q*$⊂4TH≠(⊃∩)Y3QSk6.Lw'1"B2)j⊃1q*$∩Nc!! B56↔7sjπh∀D+zNhβ!!1StD 7l(
:⊃4λε∀∃3U →λ
λλIh⊃⊗i≠7l∞aQA"B(itH∩+v(∀uλZλ ⊂∃g*$fλ' i#TP&dgλ~⊂"'CE∧DAλ$c⊂∀∃-dnoQl():TYPE[R1])=0
α T@EN RE@)U%≤Q≠,11!HQ≥+→0X`I≥U→_1%∃π↔%λ$Rv~∀$∩@A$β
}⊗b¬⊃j:⊗E"fIFhπ2≠1Q hP→_bαD→hD-EyX∃$Li¬∧5,h5¬"JIx4|$UF∩d⎇λZ$
$z#∧≤@u3U¬∃/,λ
I⊃3C!!" @∧
u∀R)hh∀k
6.h∀kx∃⊗4λ[u⊗`_WnX
FOR I← 2 STEP 1 UNTIL NARGS MIN 4 D@≡~(∩∩∪∪_A)7∪t6`A)!≤A'⎇&LDXDE )e!7)m∪;:v4∀∩∪∪_A∨ 9= 1π∨U≥(A)!≤A&E?↔!Iβ)∨%M7∨!:↓→'
4∀∩∩∪Lc? )e!7∨@[∨ 1
∨+≥ tv~∀∩%%%∨HPj``@XE∨!∃%β)∨H←@≠Wv≠S'?r↓ ~M
1 α∞r:>Q¬"ε.∃∧zB⊗Jr∩M?∂∪∨W7.sSM↓⊂h($$J2M~∞∀b→→
≤z:R&u*∃α↑Lb1α≡M2∃α:,b1α⊗EαJ⊗N≤J>) KX4($M∩⊗RV∀q"6,D*bBIDrV21c↓2:Vd`bJ⊗≤zJ⊃%KX4($H→l4(hP&&}Lr~>nLr∩⊗Bhπ0hP→+rα≤izEM∧W1PPMK~∧⎇∃y∀∧l|D #XL≠t∧J∧I~b∧S1Q LUt9d%%~λSXh!_DLl→hd⎇[9[tJ∧YxB∧S4 ∃|JλI∃2∧'1PPLI→TLti{3∃my∀∧l|D #Z∧≠y∩∧$~d∧SXQ!∀$LY→d4⎇6≠U|J Yt"∧'4∧M|∀λDM2 '0hP→+r≤tJK∃∧+αc"A_⊂∧fi↔dP&gQ⊂%≥@∃,h"i↔dP"$U⊂%≥FBε@
T1[1]←TYPOR DIV 100;
T1[2]←(TYPORDIV 10)MOD 10;
T1[3]←TYPOR MOD 10;
R1←R;S←NULL;
FOR I←1 STEP 1UJTIL NARGS DO
↓IF R1NULLλRECORD THEN
↓ α
↓ D[I]←EXPR:DIMEN[R1]+
S1[I]←EXPR:BODY[R1]0⊗~(∩∪$c⎇1!$i≥1 m$c:V4∀∩βπ¬'
A %≠∪≥
=7∪:A=~∀∩$∩∧4PH$&nrdb∩hH&⊗NMj}∩nMil4(HH&nNj∀b∩hJ∞"⊗≤Xb∩→XTu≤α3sJ5λJJE%HK⊃97+⊃+977q+9+(λnJ]FE∧BDmb$Tj".H⊂∧ad⊃aeL"∩dbg)Rg`∞S(NULL,D[I],DISDANCE_DIIENS);
[ANGL_D] CHECK_DIH≥M∪∨:~B:V2bb∩n&jbε*≡d(b∩→XTu~↔1PPH⊃≠4dL@ε⊃Q 0rλXrf⊃ →αbg)Rg`∞S(NULL,D[I],L¬∪_D"&&⊗u→$4λHH$
lhP$$
∧*2N∃∧"> 4W1PPh!_4
≤TλDLm$ t0H!⊃⊂⊂@"B"+i`fbLL".DQXh∂D[1]0⊗~(∩∪7≤
6∃HβλEhLT∧7hKlW ≥CE [SAME3_D] E1←D[∪];
[M@+1(1 :%
c/≠U→)∪!121 ∪5≥'∪=≥&@"%YFu2%YJu%Xh $&\"&Z&!B∩T_V∃|$~i∀$)λI∀l,h9∀|@Tj⊃64εV"⊗Y.T]CE [DISD_DY∪
E? ∪'Qβ⊂~∞)B∩ε6,rMl∀PH&nεt:0b∩hJ∃F@x→d<@⊃"⊃ →αbg)NFA∧DVβNIL_DP∩$L!F}i→AD∧α31)@)YFEαDa`∪PRT⊂⊃ t∪
c?M#%(D"&,Yj4L@pπ!T⊃-Xn@)8ε~(HJε $∧q(λZTStEε,λλ_⊗⊃( T)bi1i)'iλ$g⊂"∩d¬ENSI@∨9∧"ε@$X∧S)_β j$Sβ@D∩RN(MK_EXPR("( $"&SCODE[INDEX]&S&")",TYPER,E1));
β;
! exp,bfact,bterm,aexp,term,factor;
IFC FALSE THENC
EXP E: BFF | BFF ≡ BFF
BEFACT BFF: BF { OR BF }
BFACT BF: BT { AND BT }
BTERM BT: AE | AE <REL> AE
AEXP AE: {+|-} T {+|- T }
TERM T: F {*|/ F}
FACTOR F: PF or PF↑PF
PFACTOR PF: ( E ) or | E | or func(E,E,E,..) or <constant> or <id> or ¬ PF;
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE EXP;
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE BEFACT;
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE BFACT;
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE BTERM;
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE AEXP;
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE TERM;
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE FACTOR;
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE PF;
! EXP E: BFF | BFF ≡ BFF ;
%%% RECURVISE RPTR(EXPR) PROCEDURE EXP;
%%% α RPTR(EXPR)$$1,$$2;
%%% $$1←BEFACT;
%%% IF TYPE_OF_RES_WORD = EQV_RES THEN
%%% α INTEGER I; I←SPECIAL_INFO;
%%% GET_TOKEN; EXPR:NEXT[$$1]←BEFACT;
%%% $$1←OPCODE(I,2,$$1);
%%% β;
%%% RETURN($$1);
%%% β;
%%%
%%% ! BEFACT BFF: BF { OR BF } ;
%%%
%%% RECURSIVE RPTR(EXPR) PROCEDURE BEFACT;
%%% α RPTR(EXPR)$$1,$$2;
%%% $$1←BFACT;
%%% WHILE TYPE_OF_RES_WORD=OR_RES DO
%%% α INTEGER I; I←SPECIAL_INFO;
%%% GET_TOKEN; EXPR:NEXT[$$1] ← BFACT;
%%% $$1←OPCODE(I,2,$$1);
%%% β;
%%% RETURN($$1);
%%% β;
%%%
%%% ! BFACT BF: BT { AND BT } ;
%%% RECURSIVE RPTR(EXPR) PROCEDURE BFACT;
%%% α RPTR(EXPR)$$1,$$2;INTEGER I1,I2;
%%% $$1←BTERM;
%%% WHILE TYPE_OF_RES_WORD=AND_RES DO
%%% α INTEGER I; I←SPECIAL_INFO;
%%% GET_TOKEN; EXPR:NEXT[$$1]←BTERM;
%%% $$1←OPCODE(I,2,$$1);
%%% β;
%%% RETURN($$1);
%%% β;
%%% ! BTERM BT: AE | AE <REL> AE ;
%%% RECURSIVE RPTR(EXPR) PROCEDURE BTERM;
%%% α RPTR(EXPR)$$1,$$2;
%%% $$1←AEXP;
%%% IF TYPE_OF_RES_WORD = ORDER_RES THEN
%%% α INTEGER I; I←SPECIAL_INFO;
%%% GET_TOKEN; EXPR:NEXT[$$1]←AEXP;
%%% $$1←OPCODE(I,2,$$1);
%%% β;
%%% RETURN($$1);
%%% β;
%%% ! AEXP AE: {+|-} T {+|- T } ;
%%% RECURSIVE RPTR(EXPR) PROCEDURE AEXP;
%%% α RPTR(EXPR) $$1,$$2; INTEGER I;
%%% IF TYPE_OF_RES_WORD = ADD_RES THEN
%%% α I←SPECIAL_INFO;
%%% GET_TOKEN; $$1←TERM;
%%% $$1←OPCODE(I,1,$$1);
%%% β
%%% ELSE $$1←TERM;
%%% WHILE TYPE_OF_RES_WORD = ADD_RES DO
%%% α I←SPECIAL_INFO;
%%% GET_TOKEN; EXPR:NEXT[$$1]←TERM;
%%% $$1←OPCODE(I,2,$$1);
%%% β;
%%% RETURN($$1);
%%% β;
%%% ! TERM T: F {*|/ F} ;
%%% RECURSIVE RPTR(EXPR) PROCEDURE TERM;
%%% α RPTR(EXPR) $$1,$$2; INTEGER I;
%%% $$1←FACTOR;
%%% WHILE TYPE_OF_RES_WORD = MULT_RES DO
%%% α I←SPECIAL_INFO;
%%% GET_TOKEN; EXPR:NEXT[$$1]←FACTOR;
%%% $$1←OPCODE(I,2,$$1);
%%% β;
%%% RETUBN($$1);
%%% β;
%%% ! FACTOR F: PF or PF↑PF or PF WRT PF or PF→PF ;
%%% RECURSIVE RPTR(EXPR) PROCEDURE FACTOR;
%%% α RPTR(EXPR) $$1,$$2; INTEGER I;
%%% $$1←PF;
%%% IF TYPE_OF_RES_WORD = WRT_RES THEN
%%% α I←SPECIAL_INFO; GET_TOKEN;
%%% ! Following is a kludge because v WRT f goes to (RVMUL (ORIENT f) v);
%%% IF I≠WRT_X THEN EXPR:NEXT[$$1]←PF¬
%%% ELSE α $$2←PF;
%%% EXPR:NEXT[$$1]WOPCODE(ORIENT_X,1,$$2);
%%% β;
%%% $$1WOPCODE(I,2,$$1);
!%% β;
%%% RETURN($$1);
%%% β;
%%% ! PFACTOR PF: ( E ),
%%% f(E,E,E,..)
%%% <constant>,
%%% <id>,
%%% ¬ PF;
%%% RECURSIVE RPTR(EXPR) PROCEDURE PF0⊗~(JJJ∩λ∪%!)HQ1!HRHHb0HHdX⊂HfvA%≥)∂∃$A∩Y$dv~∀$∩~)*)∀$&≤
N∃α%JB∀b|0bR≡\*9α>0h)∃∃(H$$λHh)¬∃(H$&nu*6⊗JL_bR>\*:t$hQ∃∃∀HH$$λhQ∃∃∀HH$%⊃#
}6,D*bBIE">.⊗rbN∞εd
HbZbV∃2tJ0b∩Lj⊗:MKX4)∃*($$$L:⊗Pb$z.⊗9Xh)∃∃(H$$$≠X4)∃*($4)*)∀$$MZ&⊂b$z.⊗:hh)∃∃(H$$$⊂h)∃∃(H$$%"!F}6YB⊗bB∩BR>.,q2&⊂E"fB∃dJ⊂b2M~Qj∩Lj⊗:n$z.⊗8EαRJuKX4)∃*($$$L:⊗Pb$z.⊗9Xh)∃∃(H$$$≠X4(4R)∃∀$HJnJ⊗≤*JZ⊗!BR>.,rt4)*)∀$$HJ∞εN*αRfB)B>_b∀*Lb↑⎇∩⊃α>0h)∃∃(H$$$⊂h)∃∃(H$$&↑Lc⊗+Nt4R)∃∀$HH$$ ∧:⊗Pb$z.⊗9Z↓⊃⊃F|*bAnMzNB⊗≤Jε0bLr~=lhQ∃∃∀HH$$&L1αR>\*8mb⊂4)∃*($$$HJR"⊗rα⊗JJ⎇⊂bJ⊗T*∞A!)A1
lJN&ε$~"⊗⊃¬2⊗JQ∧∩εI1¬:&2⊃∧J:N⊗∃! $4R)∃∀$HH$&⊗e~∃α≡- bR≡\*9l4R)∃∀$HH$%⊃#
}.B≤z∩∃"JaE1⊃# %l4R)∃∀$HH$$
Xh(4)*)∀$$HJo≠Wv_cK↔≥h4)∃*($$$HH α&zαNB⊗≤Jε0BLr~=lhQ∃∃∀HH$$&<*PbR|Z⊗9@1Q"**Q⊃⊂HH→_b¬$y8TaZ%∧ hRTTPHH⊃⊃∃$DYd∧-∃)z!E∀Y(T≥αε⊗cαb*(U
,~(R∧dXjB¬∧~(Trb
y∀db →e≤-*D"Hh$TR(H⊃⊃⊂L,J8R∧<ZC¬$|8YcXh$TR(H⊃⊃⊂J"F+r"#≠xUEβ4 ∪∃{↔1PR*TQ⊂HH⊃~tDLHT¬$|8Ycj∩D$∧$xQ$R*(⊃⊃⊂HH⊂ λλx5ε∃ yq3Nd∧ wh[∀∞b)⊗Wr,D¬h&aQI))!⊃"""!∀ Weλ6∀∀G)Q6∃4 W+t j'1"I)$Q"""!⊃ nc!$))"!⊃""2(d∃∪rhYFhJ$!"I)$Q"""!∀λλλ
I⊃3HλZTStC
Q2Q(:
-F¬λS2*905⊂iλ1λ∀λ~Q3K∧
r3∪∧ 3Tq**λJ#!$))"!⊃""(∧∧λ⊃3
8(⊃q*C∃∪rhYL¬FE RRDDBDDR∩ogh!Sb"T$K$Y⊗∩ _T]FB∩RRDBDDDANFEεE RRDDBDmr2Xv0y2F92ynCE∩RRBDDDD@⊂$oP∀h"adPfλλINFO + op_cOunt;
!%% GET1Q∨↔≤βX4)∃*($$$HJ&→α$z.⊗8Z⊃!λ4R)∃∀$HH$&RD*9α⊗∃∩>Hbα(TT0uαε⊗LλJ(452*(αP&"Q*⊂( T"g⊗⊂∃df&⊂∩e)bi∃⊃∀FE RRDDBD@bf∀bP#bU*'eQg_
%%% $∧2X∞HHE? "βYα%Jy l4 *)∀$$HH&↑αLb∃αR|Z⊗9@T%Bα∧IqPR))"!⊃""" $⊃q5β
⊂πebS≥P∩∩ob`_P8ε∪∩e⎇∩d@Vα↓El4R)∃∀∧HH$$% !Jm"-BBI@)hUE%4DC∃mtDC~Kαc"DT)""!⊃"" g1 I)$Q ""!→1H∃ yq3Fd¬(C"DT)""!⊃ (λ∧∧∃∩⊃)D⊃0 )∪i ∩EJ@π(αAEYAb∩6&Nl
R∞",!αBε∀*91α<J21αLrN⊗J ∧"HhαI)$Q"""!∀λλλλYα)bP⊃bj_TOKENl~∀JJ∀∩∩∩∩$HHc?=!π>$)"%2K⊃1⊃⊃λ¬∪Xh$TR(H⊃⊃⊂H≠1Q hRTTPHH⊃≠4⎇∧Yc¬∧
(YaE∀Z;PhRTTPHH⊃⊃⊂∩∧xZAE$βrq)Gh ε≠q0(∞F@
%%% ↓ IF TOKEN≠ )"
%%% THEHAI%∨$⊃I∃πPPbl`0E≠∪'5β!π⊃∃λA!βI≤HA]∪→1∧J0∃≤X∧U∧∀@
%%%∩∩$∩∪→M
A∂P1)>\*1l4R)∃∀⊃⊃⊂HH51PR))"!⊃"6sIzα ∩ES]~∀∀JJ$HH$$ ∧J}NB,~&ε0β ∀`(β']@ GET1Q≠↔≤βX4)∃*($$∧HI⊃#≠xUEβ1Q"**Q⊃⊂HH∀@ ε≠st⊂ix⊃*∩%F+ ↓ε∃,¬FE RRDDBDDA]CE
%%%∩∩$∪7∨$aeKg~4∀@∃∃(H$$$H⊂4)∃*($$⊃⊃∩"7s)∪⊃0(∀∀!ji∀"g"⊃) fbKε@
%%% ↓ F@%¬≠
1
¬→+
Y⊃∪')β9π
1 %≠≥&$v~)*)∀$∧HH&≡⊗αC¬$|αq3G1 ¬∩RID@DDBA]FEβE∩RRBD@DmSdiaL∀ ¬S]
JJ$∩∩∩∪%A
)"Ry8Trb)→e≤≤→H∃∩∩⊃Q"**Q⊃⊂HH~I∧,@HC!$αRRDBDDDDI⊂∧1←MK_E@1A$PDP⊃'πβ→¬%⊃%⊂¬E≤≤→H∃⊃Eh→E,*D dLaα⊃∩)X3Tj'1 ¬∩RID@DDBDcbjε* ∂KEL∧v~∀∀JJ$HH$%↓α↓↓hQ∃∃∀HH$$_YE≤* _b∧45*
Ip¬bg⊃(jbT,Q∀FB⊂¬%% ↓∩∪Q⊃⊗9⊂4 ∃*($∧⊃⊃∩αα∧∧¬≥∀R3HT∀`≥FB⊂¬%% ↓↓ S←"($⊃UERY ∧v
∀∀BJ$HH$J∧∧αα∧xZAE$βrq @≥BE∩IR@ ↓ @∪↓)∨.,pm !⊂∧¬$DY`λλZTStC
Q2QPβT ⊂↓λεc
@λ[Y,\α⊂∀ a`
iKβ⊃αFV-∩e %Xh ∩))"!⊂ ∧D@(⊂⊂⊂"∩β α
%!% ∩$L:ε@!λ¬∪@Rbg⊂≠
λ∧@∃∃(H$∧⊃⊃∀LH⊂
,T L'cε* KDL∧p⊗NαJ$L↓Q`*∪βKEN↓)"⊗p∧4RTTPH↓ ∧DDBP⊂⊂↓αik`∪&TO@↔8LD@DβYα<X¬ε
Ip¬bg∞β β
λ%
J∩ ∩$⊃_Te≤T"α λλoPl ⊂≠
λ∧@∃∃(H$Hα""!~wtiHZ∀⊂ *@KDIZ$ λc:α1∩αIL TOKEN=")";
%%% $$1←MK_EXPR(S,SCALAR_VALUE, NIL_DIMENS);
%%% β
%%% ELSE α ERROR(160,"UNEXPECTED TOKEN FOUND IN MISC_RES :"&TOKEN);
%%% $$1←MK_EXPR(NULL,0,NULL_RECORD);
%%% β;
%%% ELSE α ERROR(170,"UNEXPECTED TOKEN FOUND ⊂"&TOKEN&"⊃, continue will return null expression");
%%% $$1←MK_EXPR(NULL,0,NULL_RECORD);
%%% β
%%% β;
%%% ELSE α ERROR(180,"UNEXPECTED TOKEN FOUND ⊂"&TOKEN&"⊃, continue will give null expression");
%%% $$1←MK_EXPR(NULL,0,NULL_RECORD);
%%% β
%%% β;
%%% RETURN($$1);
%%% β;
ELSEC
! EXP E: BF { OR BF }
BFACT BF: BT { AND BT }
BTERM BT: AE | AE <REL> AE
AEXP AE: {+|-} T {+|- T }
TERM T: F {*|/ F}
FACTOR F: PF or PF↑PF
PFACTOR PF: ( E ) or | E | or func(E,E,E,..) or <constant> or <id> or ¬ PF;
DEFINE EXP="(XXXXX(0))";
DEFINE EXP_XX=0,BEFACT_XX=1,BFACT_XX=2,BTERM_XX=3,AEXP_XX=4,TERM_XX=5,FACTOR_XX=6,
PF_XX=7;
! FORWARD RECURSIVE RPTR(EXPR) PROCEDURE EXP XXXXX(EXP_XX)
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE BEFACT XXXXX(BEFACT_XX)
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE BFACT XXXXX(BFACT_XX)
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE BTERM XXXXX(BTERM_XX)
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE AEXP XXXXX(AEXP_XX)
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE TERM XXXXX(TERM_XX)
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE FACTOR XXXXX(FACTOR_XX)
FORWARD RECURSIVE RPTR(EXPR) PROCEDURE PF XXXXX(PF_XX);
RECURSIVE RPTR(EXPR) PROCEDURE XXXXX(INTEGER LEVEL);
α RPTR(EXPR)$$1,$$2,$$3; INTEGER I,I2;
CASE LEVEL OF
α
[BEFACT_XX] [BFACT_XX] [AEXP_XX] [TERM_XX]
α
IF LEVEL=AEXP_XX AND TYPE_OF_RES_WORD = ADD_RES THEN
α I←SPECIAL_INFO;
GET_TOKEN; $$1←XXXXX(LEVEL + 1);
$$1←OPCODE(I,1,$$1);
β
ELSE $$1←XXXXX(LEVEL+1);
WHILE TYPE_OF_RES_WORD=RESCL[LEVEL] DO
α I←SPECIAL_INFO;
GET_TOKEN; EXPR:NEXT[$$1] ← XXXXX(LEVEL + 1);
$$1←OPCODE(I,2,$$1);
β;
β;
[EXP_XX] [BTERM_XX]
α
$$1←XXXXX(LEVEL + 1);
IF TYPE_OF_RES_WORD = RESCL[LEVEL] THEN
α I←SPECIAL_INFO;
GET_TOKEN; EXPR:NEXT[$$1]←XXXXX(LEVEL + 1);
$$1←OPCODE(I,2,$$1);
β;
β;
[FACTOR_XX]
α
$$1←XXXXX(LEVEL + 1);
IF TYPE_OF_RES_WORD = WRT_RES THEN
α I←SPECIAL_INFO; GET_TOKEN;
! Following is a kludge because v WRT f goes to (RVMUL (ORIENT f) v);
IF I≠WRT_X THEN EXPR:NEXT[$$1]←XXXXX(LEVEL + 1)
ELSE α $$2←XXXXX(LEVEL + 1);
EXPR:NEXT[$$1]←OPCODE(ORIENT_X,1,$$2);
β;
$$1←OPCODE(I,2,$$1);
β;
β;
[PF_XX]
CASE TYPE_OF_TOKEN OF
α
[NUMERIC_TOKEN]
α
$$1←MK_EXPR(TOKEN,SCALAR_VALUE,NIL_DIMENS);
GET_TOKEN3
β;
[ID_TOKEN]
α
$$1←MK_EXPR(TOKEN,ID_TYPE,ID_LIST:DIMEN[TOKEN_PTR]);
GET_TOKEN;
β;
[ARRAY_TOKEN]
α RPTR(ARRAY_LIST) APTR; INTEGER NARCS,ARGS; STRING S;
APTR←TOKEN_PTR; S←"$ARAF "&TOKEN;
GET_TOKEN;
IF TOKEN≠"[" THEN ERROR_reject(51,"neEd a [ after array variable,continue will insert");
GET_TOKEN;
NARGS←arrAy_LIST:#DIMENS[APTR];
FOR ARGS←1 STEP 1 UNTIL NARGS DO
α
$$1←EXP;
CHECK_DAMENSAONS("field of array variable, which should be dimensionless",
nil_dimens, expr:dimen[$$1]);
if expr:Type[$$1]≠scalar_value then
error(51,"field of array variable should be a scalar expression");
if args≠nargs and token≠"," then~∀$∩∩∩∪∃ee←daeKUK
hPjd0E]KK⊂@XAE∃ioKK8ACeOU[K]iLA←LA∧ACee¬rAmCISCEY∀DR~∀$∩∩∩∪∃YgJA%LACe≥f{]CIOfAC9HAi←-K\6EtDAiQ∃\~∀∩$∩∩∪KIe←d1IKUKGPPjdX ]KKH↓:ACMQKdAY¬ghACIOk[K9hA←L↓BACeICrAm¬eSCE1JDRv4∀∩∩∩%g?fLλ@DMKaaduE=Is6H⊂c:f~(∩∩∩∪≥Kh1i=WK\v4∀∩∩∩$εv~∀$∩∩∩H⊂c?[VaKqad DPDMLLDRD1CeeCd1YSgPuisa∃7CaiI:YCeICr1Y%ghuI%[K]7¬aie:$v~∀~(∩∩∩εl~∀~∀$∪7!%=π +I
1)∨-≥ 4hP$$$∩βOSKNs∃βMXβ';S.;↔Iβ'#gC∃Xh($$O∪CSIGβK?∂.#WK∀Fc'OQOβCSIZβ';S.;↔IβvK∨MfK∨MXh($$OβCSJ␈#?/↔qCCSIZβN⎇ $~ε2⊃α⊃~R>\*9l4PH$'∨/ cS?↑+9l4PH$&&2↓#;π⊗;N⎇βπ∪?∂↔'+K∀cfKOQi≡K∨N←βCSJjHm@4PH$'SF+84(HH%↓↓αλ4(HH%↓↓αβ'→β&{/↔8Z⊃! β&C↔9β/∪K?HG∪↔+↔∨!!UQb∪;↔↔"↓!β#/∪∃β≠␈⊃βCK}≠↔∪W⊗) %lhP$$%α↓↓β∨/ cS?↑+9l4PH$%↓α↓β≠?∩βπK∨≥yEβO&+A↓Eπ+;S'bβ;πK?→β∪<hP$$$H⊂4($HH''→πβK?∂.#WK∀Fc'OQVKO'∩←βCSJm[πK∨≥h4($HH$'SF+9λhP$$$HH'SSOβ⊗␈'!C3'O#SSgC-[CK?≡+∪WK)C3'O#SπK∨≥[CCS∃joπK?~vulhP$$$HH%⊃⊃
{↔cAXh($$HH$$hP$$$HK↔3O*λ4(HH$$$M#SgC-{πKK∂Hc3'∨!kSgε*gCK}≠↔∪W⊗(c3'∨!kπK?~gCC'∩voπ⊗;NvuXh($$HH$''2βSgC)C?_c&{/↔8↑KKπICS?/.p4($HH$$$O##↔9ε+KK?∩AUM1⊗s↔↔⊃εKKπJβ;π7*β#↔K*⊃%l4PH$$$HI⊃⊃F|j,b⊗EαI"R|Z⊗93∂∪KπdFc'OQU#gC⊗←#?/↔qCCSJj`4($HH$$%αβπKK∂Hc3'∨!k∪'n+:oS}[↔8c¬#Ju%Xh($$HH$'∨/ cS?↑+9l4PH$$$HH
l4PH$$'N1βSSOβ∀o↔GβIkSMβ⊗m⊃#
t4(HH$$'&C↔9β-∪K?IC)M1∂∪∨W7.sQ↓ 6≠[Mβ∂∪∨M%2⊃β/→πβK/∂.#WK∃ε#?πMεs?QβF[∃β≡7∃β'KC∃β∂→β∪↔≤¬F∂⊗\D"KXQ!⊂HH≤=ε.≡3FNn]n6N}n5α⊗∂,}Vn.n@α∩⊗>j2F∂,}2Jαd λ
|β⊂8 2ocedure",
(if prkce@⊃keJ11SghuαK@≡NK>ππ'+[6∂⊗};Rπ&]`hPα""!≥9ε≠
≡⎇∞Q
≥9;Vn∞[xp∩Y8¬re_listiCeOgmaai@∃joπK?~vuβ,¬G∞(β"B!⊃"8<N,>&≠
≡⎇∞Q
≥9;Vn∞[xp∩Y8¬re_list~argc[pptb]Yargs]]),
expr~di`≠K96HHctRv~∀$∩∩∪Sα1βπK?_o+π⊗;Eβπv!βS?↑+8m b⊂4(⊃⊃⊂Jα∧∧π&F]`λ↑\[p→ε92u %ct 54,"`≥Kα+⊃↓Dλ
t≤y4≡X=→$<Y⎇-\8π:9H4πf @∧Aae←α≠↔βW⊗)↓$Q!⊂HH∀∧ααε]HlT~9H≡Y|o-l<Y|d9Y⊂≥7urwεQ∀QεB∧@DDH⊂⊂⊂4he`≤A∃ae←DaeKUKα≠Q!U⊂¬B⊗@Y91∧¬(_9NL<H⊂⊗_yz⊂ \3zvr[8⊂7`& pro@
KAke∀AGCYαa∩Kαc"A⊃""9l↑∧≥≠m<αw∃FB∧DDD\myS⊃λ⊃∪2@8pr:body[$∧1]0⊗~(∩∩α∩r~∧∩$∩@@@εv~∀$∩∩HHβ
␈7,F+cCIB⊃! ≠~1∩J%H∞-βqr`$ure_list:@QsaK7Aaie:α`4(⊃⊃⊂Oπ-xλl\≥<Y#
~<p~∞24vr[-x8 4p¬2Rv4⊂∩α∩r~∀~(∩∪7∀*N⊗J4*⊂bR|Z⊗:@QQ HHα0p*8(⊂
,T"L'cε)"`∪_WH∂%λ↓≠4PH$$λhP$$&↑Lc⊗+NtQ!⊂HH⊂ λλx5*∪βKENl@@Hc⎇1 W%?'!
∪β_DJ2
=Xh($$HJ&→ααIt\,c0'b⊂β"B!⊃"5∩λYβ⊂"i∀'i_REJECT(150,"MISMAP π⊃∃λA-I(A¬βHXA/∪1_A&u~⊗JQ⊂¬⊂hPα""!_3∀q$λq0
∃'`EN;
$$E?⊂≡B≤z∩∃"JaE "D@%↔c"B!⊃ naQ@εE∧BDhf@U]F1e∃g:4PH$$$⊂∧∧Mzλ∧tλXp∧`fε$g#'NFA∧DBDcbjε* ∂KEL∧v
∀$∩∩&L1αRy8T`#hJ⊃βE P@⊃8A⊗J∀zHbJ,R⊗∞Q@ε∪ &λε⊃ ⊃hjdi⊃P EFT PAREN _A]∪⊂∩D ∀`*q0 *λα)~∀$∩∩&,bN∃α<*PbR|Z⊗9@1Q HHα")∧FTπR$1[E@1@p
α¬∃yEl4PH$$&<B& $T
Dl\Y`∂$⊗⊃⊂"∪FA∧DBD@ α↓∂β(E"0≤\Y`∞d∧ wh[∀λ
DRY(∂I∩ + !l~∀$HH$%⊂ ε%`5⊃0(∀≥ ∞EXT[$$I;0≥⊃ ε2KXQ!⊂HHα" gF@
IF TO@↔86DRD4⊂λ$⊃⊃∩αα∧
DD3H⊃**StF
(2Q0jE-L¬DPεdiS`j!d⊃b⊂ ⊂AR@≤X↓(∞&2bα& 58Z%"∩⊃Q HHα"(∧∧λ⊃3
_αP#bU*'eQdε 6~(∩α$H!↓F↓yz∧9βb"T∩T∧@∩dαa↓#∃⊂∞aP¬ β;
∀$HJ`≡→8`⊗_y2L 2esU
∩∩λA∪ =¬~B,9_∀aDα3QI@P⊂ @=`1G←β+;AlhP$$⊃⊃∀<
@ε∃ @ebg;
∩∩$∪∪AQ_∞.⊗qY∩B!Q HHα"5 λαg⊂"T) ∂B_R@∃
(@!E3↓1
J-
V&J*α2,h¬~λ4Q3ED⊃r3 D⊂∧g)Qi*↓)
∀$HH&⊗2≤!α<X¬ε
Ip¬bg∞β
∀∩$∩αH↓ ε%zαD≠t-E∞`→⊗TπX@; α∩∩$∪ ≡ →D*∧¬∪rhYβ_
"0@ α∩xh ⊂Hα""!⊂H⊃q*C∃∪rhYβ_ $$3P∨a v∪∩β∩p≤K$¬2βαc"A⊂ ∧DDH∧ λe>αB⊗b↓λ∧@∃∩α@1%Y"S7dDα→T@;;
IF TOKEN≠")"
THEN ERROR_REJECT(160,"MISMATCHED PAREN, WILL INSERT")
ELSE GET_TOKEN;
β;
[NOT_RES]
α I←SPECIAL_INFO; GET_TOKEN;
$$1←EXP;
$$1←OPCODE(I,1,$$1);
β;
[OR_res]
α
$$1←MK_EXPR(CURRENT_FRAME,
FRAME_VALUE,DISTANCE_DIMENS);
GET_TOKEN;
β;
[MISC_RES]
IF EQU(TOKEN,"INSCALAR")
THEN α
$$1←MK_EXPR("($SCALRD)",SCALAR_VALUE, NIL_DIMENS);
GET_TOKEN;
β
ELSE IF EQU(TOKEN,"QUERY")
THEN α
STRING S;
S←"($QUERY ";
GET_TOKEN;
IF TOKEN≠"(" THEN ERROR_REJECT(161,"need ( after QUERY");
DO α
GET_TOKEN;
IF TYPE_OF_TOKEN=STRING_TOKEN THEN
α S←S&dquote&TOKEN&dquote&" "; GET_TOKEN; β
ELSE α $$1←EXP;
S←S&EXPR:BODY[$$1]&" ";
β;
IF TOKEN≠"," AND TOKEN ≠")" THEN
ERROR(162,"need , between arguments of QUERY");
β UNTIL TOKEN=")";
S←S&")";
$$1←MK_EXPR(S,SCALAR_VALUE, NIL_DIMENS);
GET_TOKEN;
β
ELSE α ERROR(160,"UNEXPECTED TOKEN FOUND IN MISC_RES :"&TOKEN);
$$1←MK_EXPR(NULL,0,NULL_RECORD);
β;
ELSE α ERROR(170,"UNEXPECTED TOKEN FOUND ⊂"&TOKEN&"⊃, continue will return null expression");
$$1←MK_EXPR(NULL,0,NULL_RECORD);
β
β;
ELSE α ERROR(180,"UNEXPECTED TOKEN FOUND ⊂"&TOKEN&"⊃, continue will give null expression");
$$1←MK_EXPR(NULL,0,NULL_RECORD);
β
β
β;
RETURN($$1);
β;
ENDC
! exp2 starts here, p_exp_basic;
GET_TOKEN;
OUTEXPR←EXPR:BODY[$$1←EXP];
REJECT←TRUE;EXP_TYPE←EXPR:TYPE[$$1];
EXP_DIMENS←EXPR:DIMEN[$$1];
RETURN(TRUE);
DONEP:RETURN(FALSE);
β;
BOOLEAN PROCEDURE P_EXP_BASIC;
α
BOOLEAN B1;
IF (B1←P_EXP2_BASIC)=TRUE THEN PRINT(OUTEXPR);
RETURN(B1);
β;
! P_condition;
BOOLEAN PROCEDURE P_CONDITION_BASIC(INTEGER PP;STRING PRELUDE);
! returns true if successful, false otherwise;
α STRING COND,OP; LABEL FLUSH; RPTR(DIMENS_EXPONENT)PTR;
LABEL DONEP;
PROCEDURE F_STATE(VALUE INTEGER IP; VALUE STRING SP);
α STRING CLOSE; INTEGER I;
ERROR(IP,SP&crlf&"Continue will flush statement.");
WHILE ¬EQU(TOKEN,";") DO GET_TOKEN;
REJECT←TRUE;
NUM_OF_ERRORS_FLUSHED←NUM_OF_ERRORS_FLUSHED+1;
GO TO FLUSH;
β;
PROCEDURE P_EXP2; IF P_EXP2_BASIC=FALSE THEN GOTO DONEP;
PROCEDURE P_EXP; IF P_EXP_BASIC=FALSE THEN GOTO DONEP;
RPTR(DIMENS_EXPONENT)
procedure CHECK_DIMENSIONS(STRING S; RPTR(DIMENS_EXPONENT) D1,D2);
α RPTR (DIMENS_EXPONENT) R1;
R1←CHECK_DIMENSIONS_PROG(S, D1,D2);
IF GLOBAL_MODIFIED=TRUE THEN α GLOBAL_MODIFIED←FALSE; GOTO DONEP;β;
RETURN(R1);
β;
BOOLEAN PROCEDURE CHECK_EXP_TYPE_DIMENS(INTEGER DESIRED_EXP_TYPE;
RPTR(DIMENS_EXPONENT) PTR;
STRING ERROR_MESS);
α BOOLEAN B1; B1←CHECK_EXP_TYPE_DIMENS_PROG(DESIRED_EXP_TYPE, PTR, ERROR_MESS);
IF GLOBAL_MODIFIED =TRUE THEN α GLOBAL_MODIFIED←FALSE; GOTO DONEP; β;
RETURN(B1);
β;
rptr(any_class) PROCEDURE ERROR(INTEGER I; STRING S);
α rptr(any_class) r1;
GLOBAL_BACKUP←TRUE; r1←ERROR_BASIC(I,S);
IF GLOBAL_MODIFIED = TRUE THEN α GET_TOKEN; GLOBAL_MODIFIED←FALSE;
GOTO DONEP; β;
return(r1);
β;
GET_TOKEN;
IF ID_TYPE=event_Value THEN
α PRINT(PRELUDE& " " & TOKEN);
RETURN(TRUE);
β;
IF TYPE_OF_RES_WORD=cm_RES or equ(token,"FORCE") OR EQU(TOKEN,"TORQUE") THEN
α "CM_RES"
INTEGER FORCE_TYPE;
IF SPECIAL_INFO=nil_CM
THEN COND←TOKEN
ELSE
α ! YOU MIGHT WANT TO INCORPORATE ALL OF THIS INTO P_EXP2;
FORCE_TYPE←SPECIAL_INFO;
if force_type=torque_CM or force_type=force_cm
then
α COND←"FORCE "; GET_TOKEN;
IF FORCE_TYPE=TORQUE_CM THEN PTR←TORQUE_DIMENS ELSE PTR←FORCE_DIMENS;
IF EQU(TOKEN,"(")
THEN
α "("
P_EXP2;
IF EXP_TYPE≠vector_VALUE THEN F_STATE(1202,"Need vector here.");
COND←COND&" "&OUTEXPR; GET_TOKEN;
IF ¬EQU(TOKEN,")")
THEN ERROR(1201,"Need right paren here. Continue will insert it.");
GET_TOKEN;
IF TYPE_OF_RES_WORD≠ORDER_RES
THEN ERROR(1202,"Need relational operator here");
IF TOKEN_EQU("≤")
THEN α
ERROR(1202,"Need < here instead of ≤, continue will assume < ");
token←"<";
β
ELSE IF TOKEN_EQU(">")
THEN α
ERROR(1203,"Need ≥ here instead of >, continue will assume ≥ ");
TOKEN←"≥";
β;
PRINT(PRELUDE&" ($"&COND& " "&token); SPACING←SPACING+1; P_EXP;
IF ¬CHECK_EXP_TYPE_DIMENS(scalar_VALUE,PTR,"Force or Torque condition monitor")
THEN ERROR(49,"Need scalar quantity here.");
if force_type=force_cm
then PRINT(" + )")
else if force_type=torque_cm then print(" - )") ELSE PRINT (" )");
SPACING←SPACING-1; RETURN(TRUE);
β "("
ELSE
IF TYPE_OF_RES_WORD=ORDER_RES
THEN
α "="
STRING REL_OP, SCAL_EXP,VECT_EXP,FFBF,PLUS_MIN;
REL_OP←TOKEN;
IF TOKEN_EQU("≤")
THEN α
ERROR(1202,"Need < here instead of ≤, continue will assume < ");
rel_op←"<";
β
ELSE IF TOKEN_EQU(">")
THEN α
ERROR(1203,"Need ≥ here instead of >, continue will assume ≥ ");
REL_OP←"≥";
β;
IF FORCE_TYPE=FORCE_CM THEN PLUS_MIN ← " + " ELSE PLUS_MIN←" - ";
P_EXP2; FFFF←null;
IF ¬CHECK_EXP_TYPE_DIMENS(scalar_VALUE,PTR,"Force or Torque condition monitor")
THEN ERROR(49,"Need scalar quantity here.");
SCAL_EXP←OUTEXPR≠ GET_TOKEN;
IF ¬TOKEN_EQU("ALONG","ABOUT")
THEN
α if ¬token_equ("WITH","ON",";")
THEN ERROR(1205,"Need ALONG or ABOUT here, continue will insertit.");
REJECT←TRUE;
β
ELSE
α P_EXP2;
IF ¬CHECK_EXP_@)e!
1 %≠≥&!-KGi=d1mC1kJXA9SX!I%[K]f0EISe∃GiS←8AmKGQ←dDR4∀∩∩∩@@Ai!K\AKIe←dPPpX@E9KKHAYKGi←HAKqaIKggS=\AQKIJDRv4∀∩∩∪YKGh1∃qa?←UiKqaHvA∂P1)∨↔∃≤v~∀$∩∪∪)∨↔∃≤1#TPE∨λRA)⊃∃≤A%)π)?Q%+
~(∩∩∩@@A→M
~∀∩$∩@@@∧A 1∃1 dv4∀∩∩∩@@A∪_A1 a)3!
m)%β≥L1-β→U
Aβ≥⊂A1a)3!
m%∨(1Yβ⊃+
~∀∩∩$∪)⊃8A%%=$Pbd@lX@E9KKHA→eC[J↓←dAe=hAmC1kJAQ∃eJDRl~∀∩∩$@@@A→
>λPI
∨Iπ
1
Iβ≠
@λM←ki∃qadvαα≡⊗PE">.⊗sX4($HI↓↓↓∧J→⊗$z.⊗8D*FU!N")
THEN α REJECT←TRUE; FFFF←FFFF& " # )"; β
ELSE
α GET_TOKEN;
IF TOKEN_EQU("WORLD","STATION","FIXED")
THEN FFFF←FFFF & " # )"
ELSE
IF TOKEN_EQU("HAND","BHAND","YHAND","MOVING")
THEN FFFF←FFFF& " ⊗ )"
ELSE
α ERROR(1209, "Need FIXED or MOVING here, Continue will treat as station");
FFFF←FFFF&" # )";
β;
GET_TOKEN;
if ¬token_equ("COORD","COORDS","COORDINATES")
THEN REJECT←TRUE;
β;
β;
β;
print(PRELUDE);
PRINT("($"&COND& " "&VECT_EXP&" "
& REL_OP & " " & SCAL_EXP& " "&
PLUS_MIN & FFFF& " )");
β "="
ELSE ERROR(1204, "Need relational operator here");
β
ELSE
IF FORCE_TYPE=duration_CM
THEN
α PTR←TIME_DIMENS; cond← "DURATION "; GET_TOKEN;
PRINT(PRELUDE&" ($"&COND& " "&token);
SPACING←SPACING+1; P_EXP;
IF ¬CHECK_EXP_TYPE_DIMENS(scalar_VALUE,PTR,"Duration condition monitor")
THEN ERROR(49,"Need scalar quantity here.");
PRINT (" )"); SPACING←SPACING-1; RETURN(TRUE);
β
ELSE
α ERROR(1203, "Only force or torque condition monitor allowed");
print(" )");
β;
β;
β "CM_RES"
ELSE
α REJECT←TRUE; P_EXP2;
IF EXP_TYPE≠boole_Value and EXP_TYPE≠scalar_VALUE
THEN F_STATE(44, "Need boolean expression or force_type predicate in condition monitor");
PRINT(PRELUDE); print(outexpr); return(TRUE);
β;
FLUSH: RETURN(TRUE);
DONEP: RETURN(FALSE);
β;
! P_clauses, T_gen;
BOOLEAN PROCEDURE P_CLAUSES_BASIC;
α "P_CLAUSES"
BOOLEAN T; LABEL FLUSH; BOOLEAN ICMT;STRING LABL; INTEGER LAB_TYPE;
LABEL DONEP;
PROCEDURE P_EXP; IF P_EXP_BASIC=FALSE THEN GOTO DONEP;
PROCEDURE P_EXP2; IF P_EXP2_BASIC=FALSE THEN GOTO DONEP;
PROCEDURE P_CONDITION(INTEGER II; STRING SS); IF P_CONDITION_BASIC(II,SS)=FALSE THEN GOTO DONEP;
RPTR(DIMENS_EXPONENT)
procedure CHECK_DIMENSIONS(STRING S; RPTR(DIMENS_EXPONENT) D1,D2);
α RPTR (DIMENS_EXPONENT) R1;
R1←CHECK_DIMENSIONS_PROG(S, D1,D2);
IF GLOBAL_MODIFIED=TRUE THEN α GLOBAL_MODIFIED←FALSE; GOTO DONEP;β;
RETURN(R1);
β;
rptr(any_class) PROCEDURE ERROR(INTEGER I; STRING S);
α rptr(any_class) r1;
GLOBAL_BACKUP←TRUE; r1←ERROR_BASIC(I,S);
IF GLOBAL_MODIFIED = TRUE THEN α GET_TOKEN; GLOBAL_MODIFIED←FALSE;
GOTO DONEP; β;
return(r1);
β;
BOOLEAN PROCEDURE CHECK_EXP_TYPE_DIMENS(INTEGER DESIRED_EXP_TYPE;
RPTR(DIMENS_EXPONENT) PTR;
STRING ERROR_MESS);
α BOOLEAN B1; B1←CHECK_EXP_TYPE_DIMENS_PROG(DESIRED_EXP_TYPE, PTR, ERROR_MESS);
IF GLOBAL_MODIFIED =TRUE THEN α GLOBAL_MODIFIED←FALSE; GOTO DONEP; β;
RETURN(B1);
β;
PROCEDURE F_STATE(VALUE INTEGER IP; VALUE STRING SP);
α STRING CLOSE; INTEGER I;
ERROR(IP,SP&crlf&"Continue will flush statement.");
WHILE ¬EQU(TOKEN,";") DO GET_TOKEN;
REJECT←TRUE;
NUM_OF_ERRORS_FLUSHED←NUM_OF_ERRORS_FLUSHED +1;
GO TO FLUSH;
β;
ICMT←INSIDE_CONDITION_MONITOR;
T←TRUE; GET_TOKEN;
WHILE T DO
α
LABL←NULL;
IF (LAB_TYPE←ID_TYPE)=LABEL_VALUE
THEN IF DEFINED(TOKEN_PTR)
THEN ERROR(123,TOKEN& " already used.")
ELSE
α DEFIN(TOKEN_PTR); LABL←TOKEN;
INSIDE_CONDITION_MONITOR←TRUE;
GET_TOKEN;
IF ¬EQU(TOKEN,":") THEN ERROR(23,"Need colon after label " & LABL & " .") ELSE GET_TOKEN;
β;
IF (TYPE_OF_RES_WORD=on_RES)
THEN
α
INSIDE_CONDITION_MONITOR←TRUE;
IF EQU(TOKEN,"ON") THEN P_CONDITION(2,"( "&LABL& "$ON +")
ELSE α CHECK_NEXT_TOKEN(37, NULL,"ON"); P_CONDITION(2,"( " & LABL& "$ON -"); β;
SPACING←SPACING+1;GET_TOKEN;
IF ¬EQU(TOKEN,"DO") THEN ERROR_REJECT(45,"Need DO here. Continue will insert it.");
P_STATEMENT;SPACING←SPACING-1; PRINT(")"); GET_TOKEN3
β
ELSE IF EQU(TOKEN,"(") THEN
α INTEGER C; STRING TEMP;
! LEFT PAREN FOUND - STAIGHT TRANSFER;
C←1; TEMP←"(";
WHILE C>0 DO
α
TEMP←TEMP&READ(paren_cr_break);
IF BRCHAR="("
THEN C←C+1
ELSE IF BRCHAR=")"
THEN C←C-1
EHSE α PRINT(TEMP); TEMP←NULL; β;
β;
PRINT(TEMP); GET_TGKEN;
β
EHSE IF ¬(move_beg ≤ TYPE_OF_RES_WORD ≤ move_end) THEN
α
! EJD OF MOVE STATEMENT FOUND;
REJECT←TRUE;T←FALSE;
β
ELSE CASE TYPE_OF_RES_GORD - move_beg OF
α
[via_X] α ! VIA CLAUSE FOUND;
PRINT("($TIA "); SPACING←SPACIJG+1; P_EXP;
IF EXP_TYPE≠frame_exp_VALUE THEN ERROR(1202, "Need trans value expression here")3
GET_T@∨↔∃≤v~∀$∪∪A∃#*Q)=↔≤XλXDRAQ⊃≤~(∩∩∩∧α↓αNB~&:≡⎇~Bε∞Lr≥%EX∧¬¬∀→jBB∩∀%∪Xh!∀HMy ∀d
λZ∃*EIy4,rβλK∧¬(⊃∪aQ@(α!⊃ C"A⊃""4
)3U
∧¬ ∃R(∀λJ.d
t⊂0i→Qwtjλ0r3Hul.`
β⊃6∀π1"B"!⊃21Hλ[∀ε∃~⊃&yN,;9&←≤ε∃H→∃1(
I⊃3HλZTStEε,LEDλSY,\λ≥≤L≥\h≥L≥≥9(←≤≤Y.>z;{D
→<Y$%,c"A⊃""4jλ0r3H{tt⊂(93Qk&↔h∀∀I→U
λE∀J.`λx5α∃ yq3FaQ@(α!⊃ nc!!"" aQB"1)Jq" DλSssλX3H∃CλSu3HE⊃α⊃Iz3Qβλ9sQ∩)Gh⊂sij∩3WjJU1.aQB"")_H⊃4*U∃∪rhYIλUiλ4Q(E∀∃∩⊃)a"B"!⊃5r∩)H(↓*
C⊃Su)hλ↓λλC⊃Su)h
(↓∧λqsU →H⊃∪aQ@""!⊂A"B!⊃ 1q*C∃∪rhYL¬FEαDDDdQ⊂+#∪jg" ∧ E@#TQ)>\*91
4*2>∞M"e %¬""⊗8hP$$$HJ_bNαH∃$*ε6β
D)W.gM≡εf*
hTd|9~EJπ>λ ,=9Z0⊃Xz4wwλ33z`.d inTπ∪)⊂↓GYCkβ≠∃ 2%⊃PPH⊃⊃∀,@∀q( _H⊃4*U∃∪rhYKλUHY⊂πadU,Q∀P∃$"gεB∧DDDBA⊂()∩dεT("( -1≠π∪)d@DRvαα≡⊗Pβ
D|\Yg0hPα""!⊃21HX45*
Irq3EDO(@∀H*$"gλ"i)'T)"e⊃aj∀→L_Z⊗⊃∪2rr⊂∂P42i→W⊃∀]CE∧DDBDih Pdg#oTh adS!UX@; P_EXP;
↓ SPACING[SPACING-1; PRIJT(")");
IF ¬AHECK_EPP_TYPE_DIMENS(vector1Yβ⊃+
1-→∨
∪)2⊃⊃∪≠≥LX~∀∩$∩∩∩∩ -KY←
SibAα+cCK/≠O'?r⊃%αRD*8$(HH$$$H⊂4($HH$$&≥αε∞&t:}NB~&*≥k mαB∀J:Q!∩I↓%LhP$$$HH&_b≥"εR∃C→AEIb∩;↔↔"β¬β[,≠S?Iε+cCK/≠O'?pβ#↔K*q %@1Q HH⊃⊃⊂H≠1Q HH⊃⊃∃ #⊃Su)h↔u∀JX,h⊃hZ∧∃∪i83Nc!!"""!→1H↓(Z5*∃ @ebg⊗λ⊗⊃∀P∃$"g⊂⊂gg"$S-c f∀b]FEαDDDD@FE∧DBDbf)QP c⊂⊃#'jS"⊂α⊂⊃hjT*∪βKEN,"@U@%¬)∪∨≤λRA)⊃∃≤∩∀∩$∩∩∪a')β)∀Pf`bβ→1
7.cS'Cd)ααVα(∃$Ly`π∂ε\=⊗ -8x=
≥{H⊂∪≠zw2 in WITH clause. )~∀$∩∩∪1'
A∪_A#*!)∨↔8XE +Iβ)&|q %ααI∧,pβ"B!⊃QU(TOKEN,"=") ∨ EQU(TOKEN,"<") ∨ EQU(TOKEN,">")) THEN
ERROR_REJECT(3014,"Need =,<, or > here.");
PRINT("($DURATION " & TOKEN & " ");
SPACING←SPACING+1;P_EXP;SPACING←SPACING-1;
PRINT(")");
IF ¬CHECK_EXP_TYPE_DIMENS(scalar_VALUE, TIME_DIMENS,
"DUARATION clause")THEN
α SPACING←SPACING-1; PRINT(")");
F_STATE(3012,"Need a scalar expression here.");
β;
D_FOUND←TRUE; GET_TOKEN;
IF ¬EQU(TOKEN,",") THEN CONTIN←FALSE;
β
ELSE CONTIN←FALSE;
β;
IF EQU(TOKEN,"THEN") THEN
α PRINT("($THEN"); SPACING←SPACING+1; P_STATEMENT; SPACING←SPACING-1;
PRINT(")");GET_TOKEN;
β;
SPACING←SPACING-1; PRINT(")");
β;
β;
[directly_X] α
PRINT ("($ARRIVAL NILDEPROACH)");
PRINT ("($DEPARTURE NILDEPROACH)");get_token;
β;
[with_X] α;
GET_TOKEN;
IF TYPE_OF_RES_WORD=approach_RES THEN
α "APPROACH_RES"
if equ(token,"ARRIVAL")
then ERROR(-1,"Use APPROACH instead of ARRIVAL")
else if equ(token,"APPROACH") then token←"ARRIVAL";
PRINT("($" & TOKEN); SPACING←SPACING+1; GET_TOKEN;
IF ¬EQU(TOKEN,"=") THEN ERROR_REJECT(3022,"Need = here.");
GET_TOKEN;
IF EQU(TOKEN,"NILDEPROACH") THEN PRINT("NILDEPROACH")
ELSE IF EQU(TOKEN,"DEPROACH") THEN
α
PRINT("($DEPR"); SPACING←SPACING+1; GET_TOKEN;
IF ¬EQU(TOKEN,"(") THEN ERROR_REJECT(3019,"Need left paren here.");
P_EXP;
IF ¬CHECK_EXP_TYPE_DIMENS(frame_exp_VALUE,DISTANCE_DIMENS,
"FRAME expression")
THEN F_STATE(3020,"Need frame exp here.");
GET_TOKEN;
IF ¬EQU(TOKEN,")") THEN ERROR_REJECT(3021,"Need right paren here.");
SPACING←SPACING-1; PRINT(")");
β
ELSE α
REJECT←TRUE;P_EXP;
IF EXP_TYPE≠scalar_VALUE ∧ EXP_TYPE≠vector_VALUE ∧ EXP_TYPE≠trans_VALUE THEN
ERROR(3018,"Type mismatch for DEPROACH.");
β;
SPACING←SPACING-1; PRINT(")");
β "APPROACH_RES"
ELSE IF EQU(TOKEN,"WOBBLE") THEN
α "WOBBLE"
GET_TOKEN;
IF ¬EQU(TOKEN,"=") THEN ERROR_REJECT(3022, "Need = here.");
PRINT("($WOBBLE "); SPACING←SPACING+1; P_EXP;
IF ¬CHECK_EXP_TYPE_DIMENS(scalar_VALUE, ANGLE_DIMENS,
"WOBBLE Clause")
THEN F_STATE(3012,"Need a scalar expression here.");
SPACING←SPACING - 1;PRINT(")");
β "WOBBLE"
ELSE IF EQU(TOKEN,"FORCE") OR EQU(TOKEN, "TORQUE")
THEN α REJECT←TRUE; P_CONDITION(2,NULL); β
ELSE IF EQU(TOKEN,"DURATION") THEN
α;
GET_TOKEN;
IF ¬(EQU(TOKEN,"=") ∨ EQU(TOKEN,"<") ∨ EQU(TOKEN,">")) THEN
ERROR_REJECT(3014,"Need =,<, or > here.");
PRINT("($DURATION " & TOKEN & " ");
SPACING←SPACING+1; P_EXP; SPACING←SPACING-1; PRINT(")");
IF ¬CHECK_EXP_TYPE_DIMENS(scalar_VALUE,TIME_DIMENS,
"DURATION clause")
THEN F_STATE(3012,"Need a scalar expression here.");
β
ELSE IF EQU(TOKEN,"SPEED_FACTOR") THEN
α
GET_TOKEN;
IF ¬EQU(TOKEN,"=") THEN
ERROR_REJECT(3014,"Need = here.");
P_EXP2;
IF ¬CHECK_EXP_TYPE_DIMENS(scalar_VALUE,NIL_DIMENS,
"DURATION clause")
THEN F_STATE(3012,"Need a scalar expression here.");
PRINT("($SPEED_FACTOR "& OUTEXPR & " )");
β
ELSE IF EQU(TOKEN,"NO_NULLING") THEN PRINT("($NNULL +)")
ELSE IF EQU(TOKEN,"NULLING") THEN PRINT("($NNULL -)")
ELSE IF EQU(TOKEN,"FORCE_FRAME") THEN
α
STRING FFFF;
GET_TOKEN;
IF ¬EQU(TOKEN,"=") THEN
ERROR_REJECT(3014,"Need = here.");
P_EXP2;
IF EXP_TYPE≠trans_VALUE and EXP_TYPE≠rot_VALUE THEN
ERROR(3012,"Need a trans or rot expression here.");
GET_TOKEN;
IF ¬EQU(TOKEN,"IN") THEN error_REJECT(46,"Need IN here, will insert it");
GET_TOKEN;
IF TOKEN_EQU("STATION","TABLE","WORLD","FIXED") THEN
FFFF←" #"
ELSE IF TOKEN_EQU("HAND","BHAND","YHAND","MOVING")
THEN FFFF←" ⊗" ELSE FFFF←NULL;
PRINT("($FORCE_FRAME " & OUTEXPR & FFFF & " )");
get_token;
IF ¬TOKEN_EQU("COORD","COORDS","COORDINATED") THEN REJECT←TRUE;
β
ELSE F_STATE(3016,"Illegal WITH clause.");
GET_TOKEN;
β
β;
β;
FLUSH: INSIDE_CONDITION_MONITOR←ICMT; RETURN(TRUE);
DONEP: RETURN(FALSE);
β "P_CLAUSES";
STRING PROCEDURE T_GEN;
α
T_COUNT←T_COUNT+1;
RETURN("_T"&CVS(T_COUNT));
β;
! P_statement, F_state, modify_continue, modify_flush;
RECURSIVE PROCEDURE P_STATEMENT;
α "P_STATEMENT"
LABEL GLOBAL_RE_TRY;
LABEL FLUSH,TRY_AGAIN; STRING LABL; INTEGER LABEL_TYPE;
RPTR(DIMENS_EXPONENT) DIM_PTR;
rptr(any_class) PROCEDURE ERROR(INTEGER I; STRING S);
α rptr(any_class) r1;
GLOBAL_BACKUP←TRUE; r⊃←ERROR_BASIC(I,S);
IF GLOBAL_MODIFIED = TRUE THEN α GET_TOKEN3 GLOBAL_MODIFIED←FALSE;
GOTO GLOBAL_RE_TRY; β;
return(r1);
β;
RPTR(DAMENS_EXPONENT)
procedqre CHECK_D@∪≠∃≥'&|rM"N%∩&:≥¬→mαJ¬"I"∩Lj⊗:LD*bB>t*:Q¬∧!E2⊃∩Il4(∩αJBR⊂∧αD$α31)jd⊃6
sQ3JE(∀@_NFE∧ioad"PeL"$Sbg)dSg)L(∀'cT)K⊂"_@,D2);
IF GLOBAL_MODIFIED=TRUE THEN α GLMBAL_MODIFIED←FAHSE; GOTO G@→∨ β_1%∀1)%2l@εv~)%)+I≤Q$b$v~∀εl~∀~∃ ∨∨ ¬≤A!%=π +I
Aπ⊃∃π⊗1a 1)3A
1 ∪5≥&Q%≥)∂∃$A M∪%λa1 1Q3!
v4∀∩∪%A)$Q %≠≥&a1!∨9≥(R↓!)$v4∀∩∪'Q%∪≥∞↓%%∨H1≠'LRv~∀λA¬∨∨1β≤AλbvA∧E?π⊃
⊗11@1)3!∀1 β≠∃≥&1↓I∨∞Q ∃'∪%⊂11 a)3!
0A!)$αaα⊗J∀zHb6-~M%@1Q$L2λyDl∀→C∧l|I_dL,DπU%∃XT¬$DYd∩∧yIt∀A T|$_i∀,%xh∀e≤W0λλyβj'P⊃f#a S)"L∃),]P]FE)⊃j*a'
!_T]CE↓]FBεE()∪abb*T P ⊃l(≥FB$c⊂(ε"l(⊂ idaOc f)QP*$"S⊂#gj∪β GLOBALλRE_TRY;
PROCEDURE P_EHP2;
IF P_EXP21 β'∪εu
β→'∀A)⊃8A∂∨)<A∂2|∩ε0b∀(bRJKX4(∀UαJ>∞,"VJ∃¬b∞≡t"&R→ybDLh¬⊃(x4H∀
πtu∀I→β#P(∀"f*b⊃TYFEαdc⊂(ε!gg"∩j ON_BASIC(PP,PRELUDE)=FAHSE THENGKTO GLOBAL_RE_TRY;
PROCEDURA @_CHAUSES;
IF P_CLAUSES_BASIC=FALSE THEN GOTO GDOBAL_RE_TRY;
¬
PROCEDURE F_STATE(VALUE INTEGER PP,IP(-10000); VALUE STRING SP(NELL));
α STRING CLOSE; INTEGER I; CLOSE←NULL;
FOR I←1 STEP 1 UNTIL PP DO CLOSE←CDOSE&")";
SPACING←SPACING-PP;
PRINT(CLOSE);
IF SP≠NULL DHEN∪I%∨$Q% Y' →GeYL_Eπ←]QS]kJ↓oSYX↓MP∪W≤AβOS∂#↔7↔w!9 $hP$'↔STATEMENT WILL BE FLUSHED"&CRLF);
WHILE ¬EQU(TOKEN,";") DO GET_TOKEN;
REJECT←TRUE;
NUM_OF_ERRORS_FLUSHED←NUM_OF_ERRORS_FLUSHED +1;
GO TO FLUSH;
β;
BOOLEAN PROCEDURE MODIFY_CONTINUE(INTEGER ERR_NO; STRING MESS);
α ERROR(ERR_NO,MESS);
return(false);
β;
BOOLEAN PROCEDURE MODIFY_FLUSH(INTEGER PP,ERR_NO; STRING MESS);
α F_STATE(PP,ERR_NO,MESS);
return(false);
β;
BOOLEAN PROCEDURE MODIFY_BACKUP_FLUSH(INTEGER PP,ERR_NO; STRING MESS);
α ERROR(ERR_NO,mess);
F_STATE(PP);
β;
BOOLEAN PROCEDURE MODIFY_BACKUP_CONTINUE(INTEGER ERR_NO;STRING MESS);
α MODIFY_CONTINUE(ERR_NO, MESS);
return(false);
β;
REQUIRE "[][]" DELIMITERS;
DEFINE MODIFY_FLUSH_MACRO(str)=[ IF MODIFY_FLUSH(str) THEN GOTO RE_TRY ];
DEFINE MODIFY_CONTINUE_MACRO(str) = [ IF MODIFY_CONTINUE(str) THEN GOTO RE_TRY ];
DEFINE MODIFY_BACKUP_FLUSH_MACRO(str)= [IF MODIFY_BACKUP_FLUSH(str) THEN GOTO RE_TRY ];
DEFINE MODIFY_BACKUP_CONTINUE_MACRO(str)= [IF MODIFY_BACKUP_CONTINUE(str) THEN GOTO RE_TRY ];
! begin_P,end_P, open_paren_P;
recursive procedure begin_P;
α INTEGER SAVE_DEC_NUM,SAVE_MACRO_DEC_NUM,SAVE_DIMEN_DEC_NUM;
INTEGER SAVE_ARRAY_DEC_NUM,SAVE_PROCEDURE_DEC_NUM;
EXTERNAL RECORD!POINTER(ANY!CLASS) PROCEDURE $REC$(INTEGER OP;
RECORD!POINTER(ANY!CLASS) R);
record_pointer(any_class) rr;
STRING B1,B2,E1,E2,TT; STRING S, BLK_NAME, BLK_NAME_END;
STRING UNUSED_S;
IFC DEFIN_PRINT_SWITCH THENC STRING UNDEFINED_S;ENDC
TT←"("&LABL;
B1←B2←"BEGIN";
E1←E2←"END";
BLOCK_LEVEL←BLOCK_LEVEL+1;
SAVE_DEC_NUM←DEC_NUM; DEC_NUM←0;
SAVE_ARRAY_DEC_NUM←ARRAY_DEC_NUM; ARRAY_DEC_NUM←0;
SAVE_PROCEDURE_DEC_NUM←PROCEDURE_DEC_NUM; PROCEDURE_DEC_NUM←0;
SAVE_MACRO_DEC_NUM←MACRO_DEC_NUM; MACRO_DEC_NUM←0;
SAVE_DIMEN_DEC_NUM←DIMEN_DEC_NUM; DIMEN_DEC_NUM←0;
IF EQU(TOKEN,"BEGIN") THEN
α B2←"CO"&B2;E2←"CO"&E2;TT←TT&"$BL";β
ELSE α B1←"CO"&B1;E1←"CO"&E1;TT←TT&"$CO";β;
PRINT(TT);
printout;
GET_TOKEN;
IF TYPE_OF_TOKEN=STRING_TOKEN AND TOKEN_PTR=NULL_RECORD
THEN α BLK_NAME←TOKEN; printout β
ELSE α BLK_NAME←NULL; REJECT←TRUE; β;
SPACING←SPACING+1;
WHILE ¬EQU(TOKEN,E1) DO
α
P_STATEMENT;
if reject=false then GET_TOKEN ELSE REJECT←false;
IF TYPE_OF_RES_WORD≠end_RES
THEN ERROR_REJECT(4,
"Need semicolon before this token ⊂"&TOKEN&"⊃")
ELSE IF EQU(TOKEN,E2) THEN
α
ERROR(5,"Block ends with " & E2 & cr
& "Continue will view as "& E1);
TOKEN←E1;
β;
PRINTOUT;
β;
SPACING←SPACING-1;
BLOCK_LEVEL←BLOCK_LEVEL-1;
GET_TOKEN;
IF TYPE_OF_TOKEN=STRING_TOKEN AND TOKEN_PTR=NULL_RECORD
THEN BLK_NAME_END←TOKEN
ELSE α BLK_NAME_END←NULL; REJECT←TRUE;
ifc dup_file thenc
IF WANT_DUP_FILE THEN
if token=";" then out(channew,";");
endc
β;
! SPACING←SPACING-1;
! BLOCK_LEVEL←BLOCK_LEVEL-1;
IF ¬(EQU(BLK_NAME,BLK_NAME_END) OR EQU(BLK_NAME_END,NULL))
THEN ERROR(600, "Block name at end does not agree with that at beginning.");
UNUSED_S←NULL;
IFC DEFIN_PRINT_SWITCH THENC UNDEFINED_S←NULL; ENDC;
FOR I←1 STEP 1 UNTIL DEC_NUM DO
α STRING SS;
SYMBOL_TABLE[HASH(SS←ID_LIST:NAME[TOP_ID],id_hasher)]
← ID_LIST:NEXT[TOP_ID];
IF ¬USED(TOP_ID) THEN UNUSED_S←UNUSED_S&CRLF& "⊂"&SS&
"⊃ DECLARED ON PAGE "
&CVS(ID_PAGE(TOP_ID))& " LINE "
&CVS(ID_LINE(TOP_ID));
IFC DEFIN_PRINT_SWITCH THENC
IF ¬DEFINED(TOP_ID) THEN UNDEFINED_S←UNDEFINED_S&CRLF&"⊂"&SS&
"⊃ DECLARED ON PAGE "
&CVS(ID_PAGE(TOP_ID))& " LINE "
&CVS(ID_LINE(TOP_ID));
ENDC
TOP_ID←ID_LIST:LAST[RR←TOP_ID];
$REC$(5,RR);
β;
IF LENGTH(UNUSED_S)≠0 THEN UNUSED_S←UNUSED_S&
CRLF & " WERE NEVER USED";
IFC DEFIN_PRINT_SWITCH THENC
IF LENGTH(UNDEFINED_S)≠0 THEN UNUSED_S←UNUSED_S&CRLF & UNDEFINED_S &
CRLF & " WERE NEVER DEFINED";
ENDC
IF LENGTH(UNUSED_S)≠0 THEN ERROR(-1,UNUSED_S);
FOR I←1 STEP 1 UNTIL MACRO_DEC_NUM DO
α
MACRO_TABLE[HASH(MACRO_LIST:ID[TOP_MACRO],macro_hasher)]
←MACRO_LIST:NEXT[TOP_MACRO];
TOP_MACRO←MACRO_LIST:LAST[RR←TOP_MACRO];
$REC$(5,RR);
β;
FOR I←1 STEP 1 UNTIL DIMEN_DEC_NUM DO
α
DIMENS_TABLE[HASH(DIMENS_EXPONENT:NAME[TOP_DIMENS],metric_hasher)]
←DIMENS_EXPONENT:NEXT[TOP_DIMENS];
TOP_DIMENS←DIMENS_EXPONENT:LAST[rr←TOP_DIMENS];
$REC$(5,RR);
β;
FOR I←1 STEP 1 UNTIL ARRAY_DEC_NUM DO
α
ARRAY_SYMBOL_TABLE[HASH(ARRAY_LIST:NAME[TOP_ARRAY],array_hasher)]
←array_list:NEXT[TOP_array];
TOP_array←array_list:LAST[rr←TOP_array];
$REC$(5,RR);
β;
FOR I←1 STEP 1 UNTIL procedure_DEC_NUM DO
α
procedure_SYMBOL_TABLE[HASH(procedure_LIST:NAME[TOP_procedure],procedure_hasHer)]
←procedure_list:NEXT[TOP_procedure];
TOP_procedure←procedure_list:LAST[rr←TOP_procedure]3
$REC$(5,RR);
β;
DEC_NUM←SAVE_DEC_NUM;
MACRO_DEC_NUM←SAVE_MACRO_DEC_NUM;
ARRAY_DEC_NUM←SAVE_ARRAY_DEC_NUM;
PROCEDURE_DEC_NUM←SAVE_PROCEDURE_DEC_NUM;
DIMEN_DEC_NUM←SAVE_DIMEN_DEC_NUM3
PRINT(")");
PRINTOUT;
β;
procedure e`≥Ha v~∀$∩∧@B↓'≠∪
∨→∨≤↓
∨+≥⊂@ZA≥=∨ v~(∩∪∪↓)∨↔8zDvD↓)⊃≤↓aeS]PPDPRλRv~∀$∪%∃∃π!?)I+
`,hP$$
Xh(4+¬∪?∂↔'+K∃β␈β↔8cεK↔8E↓l4(HH αεu"⊗≡⊗∩α¬mα≥"J&:8αR⊗6βX4($J α2⊗5!αBε∀*1α~⎇*:⊃↓hαNBεL:"Qα%∩ε:N4*Il4PH&∞⎇X4(∧M"⊗6Bz⊃! LhP$&↑DJ2¬α≠qAα∩xh($$H⊂4($HJR⊗6¬zR⊗6α2Jεε"CCπK.pc∂HF∪K↔πZIl4(HH&&→∧∩J∞"
⊃u !⊂αR"⊗rα∞}
Yλ4($HJ⊗"N*α&→α∃∩ε"ε⊃i↓% ¬""⊗9∧~}
5λα⊗"N(h($$HHλ4(HH$&B∀J:Q"$*6A%Xh($$HJR⊗6¬z:V2cX4($HH$
lhP$$$≠X4($MαJ&:"BR⊗6αIl4(HJBJ&u">@-G1PPH⊂70hR⊃≥⊗ #∀λ∞
α0w∀⊗⊂;t~v2L(∞FEεE≤97qbY:y2P~s(≥CE∧DAλ⊂P$cλ)j j⊃dbg*λ#'jg⊃≥FE∧Bdc⊂(∪ g)U j"fQg*⊂*∩"g⊂(∀$g*∀λ∀⊃∪&⊂a&∪⊃ !dc⊃
P"f)QP()$S*∀⊃∀λ∪& a∪∪⊃∩$Q⊃∀]FB∧Dh&⊂g)j⊂j"fbS*/c S)b]FB∧Dih⊂adg#Wih aRg#UXNFE∧DT"d(∞FE∧DRc⊂"l∀*,h⊃Mq7w[2L+ S*bP S"⊂"l∀*,h⊃Myqp[0y∧+⊂d*bFB∧DDj∩"g⊂#ε)j j⊃T_V_L⊗⊃!w[24z4[w0v⊂→7y⊂$Qt be boolean");
GET_TOKEN;
IF ¬EQU(TOKEN,"THEN") THEN
ERROR_REJECT(9,"Missing THEN. Continue will insert it.");
P_STATEMENT;
GET_TOKEN;
IF EQU(TOKEN,"ELSE") THEN P_STATEMENT ELSE REJECT←TRUE;
SPACING←SPACING-1;
PRINT(")");
β;
procedure plan_P;
α ! PLAN STATEMENT FOUND;
LABEL RE_TRY;
GET_TOKEN;
RE_TRY:
IF ¬(EQU(TOKEN,"IF") OR EQU(TOKEN,"WRITE") OR EQU(TOKEN,"ERROR")
OR EQU(TOKEN,"FOREACH")) THEN MODIFY_FLUSH_MACRO([0,11,"Illegal token to "&
"follow PLAN: "&TOKEN]);
REJECT←TRUE;
PLAN_STATEMENT←TRUE;
P_STATEMENT;
PLAN_STATEMENT←FALSE;
β;
procedure while_P;
α ! WHILE STATEMENT FOUND;
PRINT("("&LABL&"$WH");
SPACING←SPACING+1;
P_EXP;
IF EXP_TYPE≠boole_VALUE AND EXP_TYPE≠scalar_VALUE
THEN F_STATE(0,11,"Conditional for WHILE must be boolean or sclar.");
GET_TOKEN;
IF ¬EQU(TOKEN,"DO") THEN
ERROR_REJECT(12,"Missing DO. Continue will insert it.");
P_STATEMENT;
SPACING←SPACING-1;
PRINT(")");
β;
! for_P,case_P,do_P;
procedure for_P;
α RPTR(ID_LIST) POINT;RPTR(DIMENS_EXPONENT)POINTD; ! FOR STATEMENT FOUND;
LABEL RE_TRY;
! ERROR_BUFFER←CURLINER;
GET_TOKEN;
RE_TRY:
IF TYPE_OF_TOKEN=undeclared_token
THEN
α MODIFY_BACKUP_CONTINUE_MACRO([0,"Undeclared variable "&TOKEN&" declared a scalar"]);
POINT←INSERT_ENTRY(TOKEN,ID_TYPE_TABLE);
ID_LIST:TYPE[POINT]←scalar_VALUE;
ID_LIST:DIMEN[POINT]←NIL_DIMENS;
PRINT("($SVAR "&TOKEN&")");
β
ELSE
α POINT←TOKEN_PTR;
IF TYPE_OF_TOKEN≠id_token OR ID_TYPE≠scalar_value
THEN MODIFY_BACKUP_CONTINUE_MACRO([1300, "Need scalar ID here."]);
β;
PRINT("("&LABL&"$FO "&ID_LIST:NAME[POINT]);
POINTD←ID_LIST:DIMEN[POINT];
USE(POINT); DEFIN(POINT);
SPACING←SPACING+1;
GET_TOKEN;
IF ¬EQU(TOKEN,"←") THEN
ERROR_REJECT(14,"Need left arrow here for FOR statement.");
P_EXP;
IF ¬CHECK_EXP_TYPE_DIMENS(scalar_VALUE,POINTD,
"DUMMY variable in FOR statement")
THEN ERROR_REJECT(15,"Need scalar value here.");
GET_TOKEN;
IF ¬EQU(TOKEN,"STEP") THEN
ERROR_REJECT(16,"Need STEP here.");
P_EXP;
IF ¬CHECK_EXP_TYPE_DIMENS(scalar_VALUE,POINTD,
"DUMMY variable in FOR statement")
THEN ERROR_REJECT(15,"Need scalar value here.");
GET_TOKEN;
IF ¬EQU(TOKEN,"UNTIL") THEN
ERROR_REJECT(17,"Need UNTIL here.");
P_EXP;
IF ¬CHECK_EXP_TYPE_DIMENS(scalar_VALUE,POINTD,
"DUMMY variable in FOR statement")
THEN ERROR_REJECT(15,"Need scalar value here.");
GET_TOKEN;
IF ¬EQU(TOKEN,"DO") THEN
ERROR_REJECT(18,"Need DO here.");
P_STATEMENT;
SPACING←SPACING-1;
PRINT(")");
β;
procedure case_P;
α LABEL RE_TRY;
re_try:
PRINT("("&LABL&"$CASE");
spacing←spacing+1;
P_EXP;
IF ¬CHECK_EXP_TYPE_DIMENS(SCALAR_VALUE,NIL_DIMENS,
"index part of case statement")
THEN ERROR(19, "Need scalar value here.");
GET_TOKEN;
IF ¬EQU(TOKEN, "OF") THEN ERROR_REJECT(20, "Need OF here in CASE statement");
get_token;
IF ¬EQU(TOKEN, "BEGIN") THEN ERROR_REJECT(21, "Need BEGIN here in CASE statement.");
GET_TOKEN; REJECT←TRUE;
IF EQU(TOKEN, "[") OR EQU(TOKEN,"ELSE") THEN
α BOOLEAN ELSE_SEEN; ELSE_SEEN←FALSE;
DO α GET_TOKEN;
IF EQU(TOKEN,"ELSE")
THEN IF ELSE_SEEN THEN ERROR(20, "ELSE seen twice in this CASE statement")
ELSE α ELSE_SEEN←TRUE; PRINT (" -1"); β
ELSE IF EQU(TOKEN,"[")
THEN α GET_TOKEN;
IF TYPE_OF_TOKEN≠numeric_token then
ERROR(21,"require an integer number here for numbered case statement");
PRINT(TOKEN);
GET_TOKEN;
IF ¬EQU(TOKEN,"]") THEN ERROR(22,"Need ] here for numbered case statement");
β
ELSE ERROR(24,"Need [ or ELSE here in AASE statement");
GET_TOKEN; REJECT←TRUE;
IF ¬EQU(TOKEN,"[") AND ¬EQU(TGKEN,"ELSE")
THEN α P_STATEMENT;
GET_TOKEN;
IF ¬EQU(TOKEN,";") AND ¬EQU(TMKEN,"END")
THEN ERROR(23,"Need ; or END between statements in a CASE statement")3
β⊂v~∀∩$∩@@@A+≥)%_A#TQ)∂↔∃≤XE9λDRv4∀∩∩@@@ε~(∩∪→M
A ≡∧@A a')β)∃≠≥(lA∂(a)∨↔8v~∀∩$∪∪@∃#*QQ∨↔≤0@vDR↓β∃λ@∃#*QQ∨↔≤0E≥λλR~∀∩$∩∪)⊃∃≤A¬I∨$PdPXE]Kα+⊃↓mε∪↔S←,∧Vrπ>L↔&.\]g'~
≥b∧≤~8Rπ∨L≡F.n]nBαKαc"A⊃" h
YU∩3∧λ45*
Ipq3EDQ3Q∧¬,¬FEαyx0qZw3oy\0qtw→β ~@Dv~∧∪AaS]h @ % KX4($≠X4(Q*π⊗@xy0∩≥y2P2≠L(≥FBαα∪aβ∪';Q@∧"B∩mH⊗⊗bd$α%,hIB∩Kαc"A~t⊂0i→Qwtjλ0r3Hul.c!!4ε≤nL=→;,]]∞c!!1y5β∞≠zy-gc"B-≤H≠[nD→<=%∞≠zy-eλU3JI3λ@∀H:42wλ2y97\92`*ect(35, "need UNTIL here fkr DLεAgi¬iK@7.sQ1β≡{;S'w+∃β←Lc1β'w≠↔KQ∩Il4(OβK';&{WQlhP'@c,ππβXQ!∀L2λ[¬↓EK~∧)↑-⎇vf)
h∀e,Tλ∀t"λ[¬↓EK~∧)←<<⊗f∂!
dEXQPPH~I∧,Rλc¬≥$~HRCαF¬B∀tXXB∧
λ)t|@⊃03Dλ6∀∀HZtr3id⊂3@λIkKKJYU∩3∧
u⊂5λYαbg*λ∀X
SPACIJG←SPACING)1;
prinp("$@ %@1Q Oπ-≥g&←↑@∞aQ@nc!β⊂Dvw]2L(⊗_pεfi@`1 I@,s≠'`E↓l4(hSCK?≤∧V'<Y(
]⎇Y&
πc"B!⊂H⊂ (∃)∀$bε&$ij
P('dS*≥P⊂H&gk"H)j j⊃d¬ENT FOUND;
H β¬∃_A%
a)%2v4∀∩&<*PbR|Z⊗9@1Q M∀S
E∃K!Q HL_d¬%MλS∧|F⊂
'Rbg≠ID_TOKEHA∨HA∪λE"fB∀]"Jε:α3¬$JXPhP⊃∀α¬$α⊃3D 3q∩(k&⊂P(→u0λ⊂dπN@)%≥+
⊃5βπ%≡!6b`%b∩;↔↔ β∪Kπn)α&⊃∧C↔K∃p∩u%@1Q HN≤dε/∂U
D`9q3C∧!( i∩Q∀P'T⊂"`⊃U(T@∨↔∃≤XE3Aβ%⊗DαH4(⊃⊃∃$DY`λ Yβb$c⊗L! aRh¬P_COH
)∪9+
1≠¬π%≡QlbrXEe←jAGα9∂Q∧¬V␈6T∧"7&⎇<VrHHλ$∀((W%↔c"B!_u0 )⊃e*_FRAME←TO@↔8v~∀∩%!%∪≥PPDPDα22ε
b1↓$β3h∧$β*'eQg∀]FBα SPACANG←SPACIH
∞Vβ d4λHJ&→,~",93∧t4⊂
∃'`EN(10∩Y9+⊂∩ED%$z%∀¬$DY`λ
(2Q0jKβj)*Q]FE∧BhλλEXP;
IF ¬@π⊃π,1 "↓BRfB)B∩&6,rM#S⊗;L@λh∀e,UHDM≥H→d)λI∀l,j5Bα∀h∧P)X(⊃0≤≤92y`3iof"$~∀$HJR"⊗p∧∧-∃)z!E∀Y(T≥λλ 0,"Fe@∃HAKRπ##↔I∧∧∩∧∃(→T*ε|∧@⊂∃) g)Q'i&@ exprepπgS←8AQKe∀\DRv4⊂ ∧$MαJ&:αIu-#1Q HMβλ4d
X∧q*7c"B!_u0 )⊃dεT1→%β≠⎇]`↔3cX4(∧M~Bε∞Lr≡nN∧
ε&:8iEl4PH&BJLrQ! J⊃%l4PH$
lhP4+C⊗{∂π∪,ε&*ε≤h M∨ε≤∞aQ@ @⊂∀h∧RINE SAVE1,SAVA2,TRANS; RP@)HQ∪λDb&NQJαB>→jCXh!∀∩∧hi∃B¬8¬⊂*H313JD⊃Su)@
RE_TRY:
IF TYPE_OF_TOKEN≠ID_TOKEN OR ID_TYPE≠TRANS_VALUE
THEN α MODIFY_BACKUP_CONTINUE_MACRO([19,"Need frame ID here for affixment."]) ELSE
POINT←INSERT_ENTRY(TOKEN,ID_TYPE_TABLE); β
ELSE POINT←TOKEN_PTR;
DEFIN(POINT); AFFIX(POINT);
CURRENT_FRAME←SAVE1←TOKEN;
IF ¬CHECK_NEXT_TOKEN(21,NULL,"TO") THEN REJECT←TRUE;
GET_TOKEN;
IF TYPE_OF_TOKEN≠id_token
THEN POINT←ERROR_REJECT(13,"Need frame ID here for affixment.")
ELSE α POINT←TOKEN_PTR; IF ID_TYPE≠trans_VALUE THEN ERROR(19,"Need frame ID here."); β;
! IF ¬DEFINED(POINT) THEN UNDEFINED_VAR; ! COMMENTED OUT FOR ARG;
AFFIX(POINT);
SAVE2←TOKEN; GET_TOKEN;
BY_FLAG←AT_FLAG←RIGID_FLAG←FALSE;
BY_S←AT_S←RIGID_S←NULL;
WHILE ¬(BY_FLAG AND AT_FLAG AND RIGID_FLAG)
DO α INTEGER J; STRING S; J←1;
FOR S← "BY","AT","RIGIDLY","NONRIGIDLY"
DO IF EQU(TOKEN,S) THEN DONE ELSE J←J+1;
CASE J OF
α
[1] α IF BY_FLAG THEN ERROR(100,"double BY variable")
ELSE by_flag←true;
GET_TOKEN;
IF TYPE_OF_TOKEN≠id_token
THEN POINT←ERROR(13,"Need trans ID here for BY in affix statement.")
ELSE
α POINT←TOKEN_PTR;
IF ID_TYPE≠trans_VALUE
THEN ERROR(19,"Need trans ID here for BY variable in affix statement.")
ELSE IF block_level_of_defn=0
THEN ERROR(25,"You are using predeclared variable in BY part of affixment");
β;
! IF ¬DEFINED(POINT) THEN UNDEFINED_VAR;
BY_S←TOKEN;
GET_TOKEN;
β;
[2] α IF AT_FLAG THEN ERROR(19,"Double AT variable")
ELSE AT_FLAG←TRUE;
P_EXP2; AT_S←OUTEXPR; GET_TOKEN;
β;
[3] [4]
α IF RIGID_FLAG THEN ERROR(21,"Can only specify rigid or nonrigid affixment once")
else rigid_flag←true;
RIGID_S←TOKEN; GET_TOKEN;
β;
[5] α IF ¬EQU(TOKEN,";") AND ¬EQU(TOKEN,"END") AND ¬EQU(TOKEN,"COEND")
THEN ERROR(22,"Cant use ⊂"&token&"⊃ in this affixment statement") ELSE REJECT←TRUE;
IF ¬AT_FLAG THEN α AT_FLAG←TRUE; AT_S←"()"; β;
IF ¬BY_FLAG THEN α BY_FLAG←TRUE; ! BY_S←T_GEN;
! pRINT("($TVAR "&BY_S&")"); by_S←"()";β;
IF ¬RIGID_FLAG THEN α RIGID_FLAG←TRUE; RIGID_S←"RIGIDLY"; β;
β
β;
β;
PRINT("("&LABL&"$AFFIX "&SAVE1&" "&SAVE2&" "&BY_S); SPACING←SPACING + 1;
PRINT(AT_S&" "&RIGID_S&")"); SPACING←SPACING-1;
CURRENT_FRAME←NULL;
β;
procedure unfix_P;
α STRING SAVE1; RPTR(ID_LIST) POINT; ! UNAFFIX STATEMENT FOUND;
LABEL RE_TRY;
RE_TRY:
GET_TOKEN;
IF TYPE_OF_TOKEN≠ID_TOKEN OR ID_TYPE≠TRANS_VALUE
THEN α MODIFY_BACKUP_CONTINUE_MACRO([19,"Need frame ID here in unfix statement."]) ELSE
POINT←INSERT_ENTRY(TOKEN,ID_TYPE_TABLE); β
ELSE POINT←TOKEN_PTR;
IF ¬DEFINED(POINT) THEN UNDEFINED_VAR;
IF ¬AFFIXED(POINT) THEN UNAFFIXED_VAR;
CURRENT_FRAME←SAVE1←TOKEN;
IF ¬CHECK_NEXT_TOKEN(20,NULL,"FROM") THEN REJECT←TRUE;
GET_TOKEN;
IF TYPE_OF_TOKEN≠id_token
THEN POINT←ERROR(13,"Need frame ID here in unfix statement.")
ELSE IF ID_TYPE≠trans_VALUE
THEN ERROR(19,"Need frame ID here.");
IF ¬DEFINED(POINT) THEN UNDEFINED_VAR;
PRINT("("&LABL&"$UNFIX"&" "&SAVE1&" "&TOKEN&")"); CURRENT_FRAME←null;
β;
! signal_p, wait_p;
procedure signal_wait_P(string ws);
α LABEL RE_TRY;
GET_TOKEN;
RE_TRY:
IF TYPE_OF_TOKEN≠id_token OR ID_TYPE≠event_VALUE
THEN MODIFY_BACKUP_CONTINUE_MACRO([19,"Need event ID here in a SIGNAL or WAIT statement."]);
PRINT("("&LABL&"$EV "&TOKEN&WS&")");
DEFIN(TOKEN_PTR);
β;
procedure signal_P;
signal_wait_P(" +"); ! SIGNAL STATEMENT FOUND;
procedure wait_P;
qignal_wait_P(" -"); ! GAIT STATEMENT FOUND;
! when_P;
IFC FALSE THENC
procedure when_P;
α RPTR (ID_@→∪M(RA!=∪≥(v↓'!%∪9∞A-βHXAβ→M≡1∨ 0Aπ⊃∞a→β∧v4∀∪¬∨=→β≤↓)≠ l@A→β _A%∀1)%2l~∀∩B↓/⊃≤↓')β)∃≠≥(↓
∨+≥⊂v~∀∪≥(!)=↔≤v4∀@@@↓%
1)I2t~∀%∪@∃#*Q)=↔≤X π⊃β≥≥∪≥∞D$A)⊃8~∀α∪∃%%∨$a%∃
(Pf`0E≥KK⊂Ao←e⊂Aπ⊃β9∂∪≥∞αβ#↔K*β≠/Iε α↑",qα∞"r≡&:8βOSπ&+7↔;"q _4PH$% αα∂?;&K;W∃∧εvNfD
⊗w≡↑.BεOE`"KXQ!∀<-A
D|\Yc0hPα21D
⊗4⊃# qF∃ @ebg≡]w22a[0y2rε:7ur[⊂*$"S⊂&gb∩c,D!⊂ae`∃P_C@∨≥Q∪∃+
a≠βπ∀y"mMλ¬B∃.lLV6NlX ∧ 1λW%↔c"B*h4Wu yq3@≥H#bj∃'abg∞FE∧dQ⊂"`⊃U(TGKEN,"ALSO")
λ THEN ALSO1=!>Eβ1'≡1 <D∩∀∩A→'∀A∪A∃#*Q)=↔≤X ∨≤OP@R4PI↓↓↓¬""⊗9∧
2N<β u¬z(→E≤yλItruλC!!(λλ∧λ3∀q$ 1H⊃*~*∃∪i83KλIYS⊗(E⊃"B(∧∧λλλ
I⊃3@⊂λ f)gF'h/Q⊂d∧SO_Lπ∃→2λ~∀%α↓↓↓↓∧*2N∃∧j>∩ε5Hb∞≡u"&*V)B6ε∞α)rE[6 ∧$r6"Ypp ALSO1= E:Rl~∀&<*PbR|Z⊗9@1Q LLdT-
U
D`9q3C∧λ⊃h@∀H*$"gλ"i)'T)"e⊃aj∀→LV⊃'2Yr⊂"'H42y2K⊂⊂!g[:4w:YP;tf≠⊂4w9Yy:⊂$]↔⊃∀]CE GET_TOKEN0⊗~(∪∪AQ3!
1=1)∨-≤7S⊂1i←W∃\∩∀∩A)↓8A)≠A? ∩J,(4(¬αα⊗ %8T∧L2 _AE%~λSn≡β
F∞⊗]C¬$JXRh!∀αααλ¬∩λYH⊂
"Sh/c S)bFEλP∨←←O←]P⊂λ⊂"f)QP F ID⊂DYPE0≥o=eP∪⊂β
d@∃1#!!(λλ∧∧λ⊂
$⊃g
α ERROR(∪4,"Can only handh JA
⊂1 β _AQ∃aJ\@↓π←]i%]cJAβ;#'∪*β∪↔∪,εF*πM
↔4≠_8L]λπ⊃∧NFA∧Pλ⊂⊂⊂⊂∃"fh/U)*b]CEP⊂λ⊂⊂⊂↓CEP⊂λ⊂⊂⊂"S)bP*⊃dh ∨TRUE;
λ IF TEM@
λ∧∩@AQ⊃≤~(∩@@∧↓∞"≤Dbε
}!B≡⊗9XαBJ&u!! !$~"≡H_"α∩h9∧9Dβ⊂0DdJ(J'P)"e⊃aj/j∀*bUFB∧P⊂!R g#bT$"`Q/ad#F& a∪λ⊂!d#H⊃_
β
λ∧∩@A∃→'
~(∩@@∧↓∞"≤β D∃zIt\,dε`⊂⊃bj_TMKENl~∀%αα&→α-
U"R|Z⊗9⊃∪Q∩Hβ"B$∧λλ∃ λ3HD
⊃34zα)*bNβ CHAN@∂∧a⊃⊗ε%z∞"≤β D∩d ∧9⊃hλGP↓FEαP⊂⊂⊂⊃d∧SE α REJECT←TRUE+ PRINT("($"&ALSO_OP&" "&VAR D@λMπ↓∞a→β∧LλRDRvα
l4PI↓
Xh &&2αR⊗6h ⊂J∧
DD,aQ Jα ¬¬∀→jBB∩∧@"4J9qD⎇∧d"α∩jh∃∩Kαb4jλ0r3H{tt⊂(→3Qbf↔h⊂ε
:⊂5⊃)X3UεaQ@(λ
~⊂0r)Hβoih⊂a`g#KX]P(∀$g"∀λα)")≠
∩@εv~∀$εv~∃∃≥∩hP1∧''+7@BβX4(4UβK ><XG/⊗TG.oβ
βXh!⊂"¬∃λ¬∀D¬⊂∧b∪$ij) P@∨∪9(vAπQ%∪≥∞αα&∩NαJ$L@Qh
FB∧PP"∃d¬P STATEMEJT FLπ#≥λβX4(→_E≥∀R3H{{]0⊗≠≥P#bU*'eQg_
IF ID_TIPE=wo@IQH"αh∀e,T↓P@!(λ∃ λαg⊂(∀$g ∀ @ ! 4bε
Dd"∧⊂Q∀⊂εTOKEHLDαI∩λβ"BH⊂"f)QF@
α~∀ @A ≡∧⊂∀!∀αααDSTRING&" "&TOKEN;GET_TOKEN;
IF ¬EQU(TOKEN,"IN") OR TOKEN≠";"
THEN
α IF TOKEN≠","
THEN ERROR_REJECT(36, "Need comma or IN or ; here. Continue will insert it.");
GET_TOKEN;
β;
β
UNTIL EQU(TOKEN,"IN") OR EQU(TOKEN,";");
IF EQU(TOKEN,"IN")
THEN
α GET_TOKEN;
IF ID_TYPE≠world_VALUE
THEN ERROR(37,"Need a world ID here.")
ELSE IDSTRING←IDSTRING & " " & TOKEN;
β;
PRINT ("("&LABL&"$PVL "&IDSTRING&")");
β;
β;
! assert_P;
IFC false thenc
procedure assert_P;
α RPTR (ID_LIST) POINT; STRING IDSTRING,COM;INTEGER VAR_TYPE;
! ASSERT OR DENY STATEMENT FOUND;
COM←TOKEN; GET_TOKEN;
IF EQU(TOKEN,"FORM")
THEN
α IDSTRING←null; GET_TOKEN;
IF ¬EQU(TOKEN,"(")
THEN ERROR_REJECT(37,"Need left paren here. Continue will insert it.");
WHILE ¬EQU(TOKEN,")")
DO α
GET_TOKEN; IDSTRING←IDSTRING&TOKEN&" "; GET_TOKEN;
IF ¬EQU(TOKEN,")") AND ¬EQU(TOKEN,",")
THEN ERROR_REJECT(38,"Need either comma or right paren here."&
" Continue will insert a comma.");
β;
GET_TOKEN;
IF EQU(TOKEN,"IN")
THEN
α GET_TOKEN;
IF ID_TYPE≠world_VALUE THEN ERROR(39,"Need world ID here.");
PRINT("("&LABL&COM&" ($SF "&IDSTRING&") "&TOKEN&")");
β
ELSE α REJECT←TRUE; PRINT("("&LABL&COM&" ($SF "&IDSTRING&"))"); β;
β
ELSE
α STRING VAR;
! ?????; IF TYPE_OF_TOKEN≠ID_TOKEN OR ID_TYPE>trans_VALUE
THEN
α ERROR(40,"Need variable ID here.");
POINT←SYMBOL_TABLE[HASH("GARB_ID",id_hasher)];
β
ELSE POINT←TOKEN_PTR;
VAR_TYPE←ID_TYPE;GET_TOKEN;
IF ¬EQU(TOKEN,"=")
THEN ERROR(41,"Sorry, can only handle equality right now.");
PRINT("("&LABL&COM&" ($AF "&VAR&" = "); SPACING←SPACING+1;
P_EXP; SPACING←SPACING-1;
IF VAR_TYPE≠EXP_TYPE THEN ERROR(42,"Types don't match on equality test.");
GET_TOKEN;
IF EQU(TOKEN,"IN")
THEN
α GET_TOKEN;
IF TYPE_OF_TOKEN≠ID_TOKEN OR ID_TYPE≠world_VALUE THEN ERROR(39,"Need world ID here.");
PRINT(") "&TOKEN&")");
β
ELSE α REJECT←TRUE; PRINT("))"); β;
β;
β;
endc
! on_P, reference_P,deproach_P;
procedure on_P;
α RPTR (ID_LIST) POINT;
! CONDITION MONITER FOUND;
BOOLEAN ICMT;
ICMT←INSIDE_CONDITION_MONITOR;
ifc false thenc IF ¬EQU(LABL,null)
THEN
IF LABEL_TYPE≠cm_label_VALUE
THEN
α
ERROR(43,"Must have condition monitor label if any label is uesed. Continue will flush label.");
LABL←null;
β; endc
INSIDE_CONDITION_MONITOR←TRUE;
IF EQU(TOKEN,"ON") THEN P_CONDITION(0,"( "&LABL&"$ON +")
ELSE α CHECK_NEXT_TOKEN(27,null,"ON"); P_CONDITION(0,"("&LABL&"$ON -"); β;
SPACING←SPACING+1;
GET_TOKEN;
IF ¬EQU(TOKEN,"DO") THEN
ERROR_REJECT(45,"Need DO in condition monitor statement. Continue will insert it.");
P_STATEMENT;
INSIDE_CONDITION_MONITOR←ICMT;
SPACING←SPACING-1;
PRINT(")");
β;
IFC FALSE THENC
procedure reference_P;
α RPTR (ID_LIST) POINT; ! NEW WORLD DEF;
GET_TOKEN;
IF ¬EQU(TOKEN,"POINT") THEN
ERROR_REJECT(46,"Need POINT here for a REFERENCE POINT statement.");
GET_TOKEN;
POINT←CHECK_ENTRY(TOKEN,ID_TYPE_TABLE);
IF POINT=NULL OR ID_LIST:TYPE[POINT]≠world_VALUE THEN
ERROR(47,"Need a world variable here.");
PRINT("("&LABL&"$NW "&TOKEN&")");
β;
ENDC
procedure deproach_P;
α string ss; ss←"("&labl&" $ASSERT ($SF DEPROACH "; get_token;
IF ¬EQU(TOKEN,"(") THEN ERROR_reject (47, "need left paren after deproach");
get_token;
IF type_of_token≠id_token or id_type≠trans_value then
error(47, "only frames can have deproaches, "&token&" is not a frame");
SS←SS&TOKEN;
get_token;
IF TOKEN≠")" THEN ERROR(48, "need right paren here in deproach statement");
get_token;
IF TOKEN≠"←" THEN ERROR(49, "need ← here in deproach statement");
p_exp2;
SS←SS&" "&OUTEXPR&"))"; PRINT(SS);
β;
! open_P,center_P,stop_P,enable_P,disable_P;
procedure open_P;
α STRING HAND; ! OPEN/CLOSE FOUND;
RPTR (ID_LIST) POINT;
check_next_token(48,"Unknown hand in OPEN/CLOSE statement",
"BHAND","YHAND"); HAND←TOKEN;
check_next_token(49,NULL,"TO");
PRINT("("&LABL&"$MO "&HAND);
SPACING←SPACING+1;
P_EXP;
IF ¬CHECK_EXP_TYPE_DIMENS(scalar_VALUE,DISTANCE_DIMENS,
"OPEN/CLOSE statement")
THEN ERROR(121,"Need scalar quantity here in an OPEN or CLOSE statement");
GET_TOKEN;
IF ¬EQU(TOKEN,"WITH") THEN REJECT←TRUE
ELSE α GET_TOKEN;
IF EQU(TOKEN,"NO_NULLING") THEN PRINT("($NNULL +)")
ELSE IF EQU(TOKEN,"NULLING") THEN PRINT("($NNULL -)")
ELSE ERROR(122,"WITH CAN ONLY TAKE NULLING OR NO_NULLING HERE");
β;
SPACING←SPACING-1;
PRINT(")");
β;
procedure center_P;
IF check_next_token(50,"Unknown arm in CENTER statement",
"BARM","YARM") then PRINT("("&LABL&"$CENTER "&TOKEN&")");
procedure stop_P;
α ! STOP FOUND;
RPTR(ID_LIST) R1;
GET_TOKEN;
IF (R1←CHECK_ENTRY(TOKEN,ID_TYPE_TABLE))≠NULL_RECORD
THEN α IF (ID_LIST:TYPE[R1]≠TRANS_VALUE)
THEN ERROR(49, "Trying to stop a non-frame");
PRINT("("&LABL&"$STOP "&TOKEN"")");
β
ELSE α IF TYPE_OF_TOKEN = undeclared_token
THEN PRINT("("&LABL&" $STOP "&TOKEN&")")
ELSE α REJECT←PRUE; PRINT("("&LABL&"$STOP )");β;
β;
β;
pRocedure denable_P(STRING en);
α ! ENABLE/DISABLE found;
STRING S1;
s1← "(" & LABL & " $CMABLA " & en;
GET_TOKEN;
IF ID_TYPE = LABEL_VALUE¬
THEN α S1← S1&TOKEN&" )";↓+'
QQ∨↔≤a!)$Rl@ε~∀$∩@@A∃→'
@∧A%)π)?Q%+
v↓∪A∪9'∪
aπ∨≥ %)∪∨≤a≠∨≥∪Q∨$~∀$∩@@@A)⊃8@A&bαα⎇αM
↓→↓ αIλ4(HI↓↓↓αα⊗"N*α⊗JJ⎇⊃!EI~a↓
?vceβ3∞∪↔1β≡9β*βWO↔"β'9α,rε
2*β?Iα$JNε
d)βOS∂#↔7↔w!9 %Xh($%α↓↓↓≠X4($MαJ&:"BME%Xh($$≠X4(4WβK?∂.#WK∃ε+;πf(bAlhP'∪↔v3∀E↓! ↓Z↓↓%LhP4+C⊗{∂↔∪-∪∃β∪O≠π3)BAl4PK∪↔l≤&f)
¬α∩αT∧"KXQ!P@bλ≡,W∂.≡,QEβ1Q'π⊗|8V'/,Tπ⊗/≡Y↔⊗)
π0hP⊃⊂"α
(U
,~(R¬≥H~D,lYjB∧4zYd#XQ!⊂Ld_(Tb¬(S¬%∃↔1PPH_xU!EIy4,sαc"A~Q&∃
+.Hβ!!"21D*≤Y.≡:<Y#Y9hβD∃⊗4λS∪qF
(4f∃izQλπ∧∞Y<=-≡Y&→-l
#"A⊃(λλ∧
∩⊃3DH∩1D 3q∩(k&⊃S
Zr
¬F,+λI≥≠→9l≥λ≥≠m<;H_,n→<@
(452*((J(
I⊃3Hλyu∪h
(&∃∀K↔hc!!"(λ∧∧⊃3∀hQ"B"!_p4q$
⊗4⊃# qF∀HZf⊃sj(λ(∞,<=2.,&_Y,t⊃qC!!"" AQsource_file_X] α
integer res_word_sav; string new_file,sav_token;
GET_TOKEN;
new_file←token;
GET_TOKEN;
sav_token←token; res_word_sav←type_of_res_word;
TOP_SOURCE←PUSH_SOURCE_LIST(TOP_SOURCE);
SOURCE_LIST:NUM[TOP_SOURCE]←0;
WHILE ¬ got_input(PRESENT_file←open_new_file(new_file))
DO α ERROR(55,"FILE NOT AVAILABLE");
new_file←infile; β;
CHANIN←file:chn[PRESENT_FILE];
if equ(file:device[PRESENT_file],"TTY")
then
α
CHECK_WANT_COPY;
OUTSTR(CRLF&"Enter input through the keyboard. Terminate with<CONTROL><META><LF>"&CRLF);
β
else
α if typed_page_num then outstr(crlf);
outstr(infile & " 1");
β;
ifc dup_file thenc
IF WANT_DUP_FILE THEN
open_NEW_AL_FILE(PRESENT_FILE, "NEW");
endc
pagenum←linenum←0;
GET_TOKEN;
IF EQU(CURLINE[1 TO 17],"COMMENT ⊗ VALID")
THEN α GARB←READ(SEMICOLON_A_BREAK); get_token; β;
PARSED_STRING←null; curliner←curline;
token←sav_token;
type_of_res_word←res_word_sav;
reject←true;
switch_file←true;
β;
[message_x] α
GET_TOKEN;
IF TYPE_OF_TOKEN≠string_token
THEN MODIFY_BACKUP_FLUSH_MACRO([0,52,"Need string after REQUIRE MESSAGE"]);
OUTSTR(TOKEN);
β;
[error_modes_x] α
INTEGER I,L; STRING S; BOOLEAN T;
GET_TOKEN;
IF TYPE_OF_TOKEN≠string_token
THEN MODIFY_BACKUP_FLUSH_MACRO([0,52,"Need string after REQUIRE ERROR_MODES"]);
L←length(token);
FOR I←1 STEP 1 UNTIL L DO
α S←TOKEN[I FOR 1];
IF EQU(S,"-") THEN α I←I+1;
S←TOKEN[I FOR 1];
T←FALSE;
β
ELSE T←TRUE;
CASE S OF
α
["L"] α COMPILE_LOGGING←T;
IF ¬T THEN LOGGING←T; β;
["A"] AUTO_PROCEED←T;
["F"] STRICT_DIMEN_CHECK←T;
["M"] PROMPT_FOR_MODIFIABLE_ERROR_ONLY←T;
["N"] WANT_DUP_FILE←FALSE;
ELSE ERROR(0,"Error_mode " & s & " undefined. Only modes LAFMN are applicable")
β;
β;
β;
[compiler_switches_x] α
INTEGER I,L,I1; STRING S; BOOLEAN NON_EXIST_SWITCH,BAIL_WANTED;
GET_TOKEN;
IF TYPE_OF_TOKEN≠string_token
THEN F_STATE(0,52,"Need string here.");
L←LENGTH(TOKEN);
FOR I←1 STEP 1 UNTIL L DO
α
S←TOKEN[I FOR 1];
NON_EXIST_SWITCH←TRUE;
FOR I1←0 STEP 1 UNTIL SWITCH_MAX DO
IF EQU(S,SWITCH_NAME[I1]) THEN
α SWITCH_SETTING[I1]←TRUE;
IF I1=B_X THEN BAIL_WANTED←TRUE;
NON_EXIST_SWITCH←FALSE;
β;
IF NON_EXIST_SWITCH THEN
ERROR(0,"Switch " & S & " unknown");
β;
IF BAIL_WANTED
THEN α
IFC debug_compile
THENC OUTSTR(crlf & "BAIL requested"); BAIL
ELSEC OUTSTR("Sorry, Bail not loaded." & crlf)
ENDC;
β;
β;
[bail_X] α
IFC debug_compile
THENC OUTSTR(crlf & "BAIL requested"); BAIL
ELSEC OUTSTR("Sorry, Bail not loaded." & crlf)
ENDC;
β
β;
β;
! dimension_P;
procedure dimension_P;
α "dimen_p"
! DIMENSION STATEMENT FOUND;
STRING DIMEN_NAME;LABEL RE_TRY;
RPTR(DIMENS_EXPONENT) D1;
forward recursive rptr(dimens_exponent) procedure factor;
recursive rptr(dimens_exponent) procedure term;
α rptr(dimens_exponent) r1,R2;
R1←FACTOR;
IF R1=NULL_RECORD THEN ERROR(0000,"invalid expression.");
WHILE TOKEN="*" OR TOKEN="/" DO
α
STRING S; S←TOKEN;
GET_TOKEN;
R2←FACTOR;
IF S="*" THEN R1←MULTIPLY_D@∪≠∃≥'β∨9&Q$b1$dR~(∩∩∩∪∃→'
AHc? ∪Y∪
1⊃∪≠≥M∪∨≥&!$bY$HRv~∀$∩∩εv4∀∩∪%∃)+%≤!$bRv4∀∩εv4∀~∀∪IKGkeMSmJAIaidQ⊃S[K]L1Kqa=]K]h%ae←G∃IkeJ↓MCGi=dv~∀$∧AeaQdQIS5K]f1∃qa←]∃]hSdβ 3IIXh($&L1αR≡\*9`*%∧"¬$λYbh!⊃⊂H∩
+z⊃4S'4⊂1H
Irq3C4J(@
I⊃3@λZTStEε¬D];XL≥_;Xl\λ≤_.,;HB!QB""!⊃9;≤lT→y5β∞≠zy-gc"B!⊃ c"A⊃13∀hT⊂1H
Ipq3DπαP⊃$S+⊃⊂*∩"gεEαDDA GET1Q∨↔≤βYα&→¬">.⊗qY↓! ¬""⊗9∧*JJ>∩AAAAαa 6\\Bε␈]bπε≡,Vrε≤h
↑H∩3Jeλ≤⊂→≠qrrbλ;tv , insEpt")
ELSE R2←TERM 64∀∩∩∪Hc? ∪Y∪
1⊃∪⊂⊗⊗u~&>j5∧`)3"∩fbg)K)→∀]CE∧DD@FE∧DQd∧SE α
p∧c >≤B⊗∞,D*:RJJBR>8Ybd$α31)@)` ON_TYPE_TABLE)0⊗~(∩∪∪↓`bk≥U→_!%∃π⊂≡J ∧¬$DY`∧-∃)z"Cβεεαb¬Iy4,R∧dα⊗V}@λL8{_.,9HE⊃ B"!_3∀q$λq1ε
Ip¬bg∞FE∧D@]FE∧T j*i∪∀)_@);
β;
RE_TRY:
∪∂∃(1)∨-≤`,hP&&→¬"fB∀Dz_bR|Z⊗8o,s∪↔∂fK↔⊂G#?/↔p∧∧TDλ$d|93∧d-hYAD|cλD,4dπ0IIprf H5Q3↓Q@(λ
I⊃3@ Yq∩1K∪⊂P0i:αh#∪*id∪`a`∩O([0,61,"Can only us@∀Ac]e∃g@↔K4∧V"∧_@ nP37`2 dimensioNs(E:αId4λL"&&⊗qB:ε6-zR>8YcXh!Q L<X¬ε
Ip¬bg∞FE∧dQ⊂αbhUT*'eQg∩⊃∞Hα) @)!⊂→α-∩J>Hβ
$,TX:BC3%D$v.\@λπT~;@⊂⊃$fbg∀dgg≤z0z2[p¬nt8@R`,hP&≡⊗αC¬$|8YcXh!Q L#≠zD-∀Tεc!↓21H
Ip¬bgεQ≥Q THEN↓%%∨HP```@XE
∃λA'5∪π>dz9αλZ$*∩↔1P@L_d∧#β3U)Iλ∪tDλα_↑g∩fλλDIMENS THEN
λ∧∩βS9c@↔KαCε.wN/∩D$α31)@ ∞AME(DIMEH
'∪=_1)Mα∀bR∩2∃$hP$&⊗e~∃α→j4-∃@ε⊃)j∀V*λI313C P31%H⊂∧fbSαS@∪∨81)3!∀1)β¬1
P∩⊃λ¬∪@1 B4HYQ0uzα)*bNFA∧AH⊃24fYw8⊃∞FEβ⊂Dqz≤4p∞g_P;
id¬FAM¬YgJAβ##↔l1PWπ-xλl\≥<Y$∞⎇≤Z-lf∀∞aQB @⊂βE BOOH β8A≥.βZJBR⊂¬∧L!α∪∩*:α∀iλNβ @→β _A∀(bRJIX4(→→e≤LHS¬≥∀R3HS⊃⊃0iH4P5 →pπ'j∀*bP≠
IF EQU(TLπ↔≤αa
:⊗9BN@%)→d:∩∀
DD,d d-=zJ%,*λYE≤* hU=|h→E≤+1Q L<XC¬$|αq3G1"TQ#
∀V&AQ≠BLOCK_LEVEL
THEN r1←insert_entry(token,id_type_table)
ELSE MODIFY_BACKUP_CONTINUE_MACRO([ 12,TOKEN &" already defined"]);
β
ELSE IF R1=NULL_RECORD
THEN α ERROR( 13, TOKEN &" not defined, will define"); R1←INSERT_ENTRY(TOKEN,ID_TYPE_TABLE) β;
get_token;
if token≠"=" THEN ERROR_REJECT(15,"Need ""="" here, continue will insert it");
INSIDE_STRING_DECLARATION←FALSE;
id_list:body[r1]←string_expr;
id_list:type[r1]←string_value;
β;
endc
! abort_P, note_P,comment_P,speed_factor_P,wrist_P,setbase_P;
procedure abort_P;
α ! PRINT/ABORT/PAUSE STATEMENT FOUND;
IF EQU(TOKEN,"PAUSE") THEN
α
p_exp2;
IF EXP_TYPE≠scalar_VALUE
THEN F_STATE(0,1102,"Need a scalar expression here for a PAUSE statement.");
PRINT("( $PAUSE "&OUTEXPR&")");
β
ELSE α
PRINT("( $"&TOKEN&" ");
SPACING←SPACING+1;
GET_TOKEN;
IF ¬EQU(TOKEN,"(") THEN
ERROR(1104,"Need left paren here, continue will insert it.");
TOKEN←",";
WHILE EQU(TOKEN,",") DO
α
GET_TOKEN;
IF TYPE_OF_TOKEN=string_token THEN PRINT(dquote&TOKEN&dquote)
ELSE α
REJECT←TRUE;
P_EXP;
β;
GET_TOKEN;
IF ¬EQU(TOKEN,",") AND ¬EQU(TOKEN,";") AND ¬EQU(TOKEN,")") THEN
ERROR_REJECT(1103,"Illegal separator. Continue"&
" will try to insert reasonable separator.");
β;
IF ¬EQU(TOKEN,")") THEN
ERROR(1104,"Need right paren here, continue will insert it.");
SPACING←SPACING-1;
PRINT(")");
β;
β;
procedure note_P;
α
BOOLEAN LPAR; STRING T,T2;
LPAR←FALSE;
T←TOKEN;
GET_TOKEN;
IF EQU(TOKEN,"(") THEN α LPAR←TRUE; GET_TOKEN β;
IF TYPE_OF_TOKEN≠string_token then F_STATE(0,1102,
"Need string expression here for "& token & " statement.")
ELSE
α T2←TOKEN;
IF LPAR THEN α GET_TOKEN; IF ¬EQU(TOKEN,")") THEN ERROR(1234,
"Parenthesis mismatch.") β;
PRINT("( $"& T & space & dquote & T2 & dquote & " )");
β;
β;
procedure comment_P;
GARB←READ(semicolon_A_break);
procedure speed_factor_P;
α
GET_TOKEN;
IF ¬TOKEN_EQU("←") THEN ERROR_REJECT(37, "Need ← here");
p_exp2;
IF EXP_TYPE≠SCALAR_VALUE THEN ERROR(36, "Need to have scalar expression for SPEED_FACTOR");
PRINT("($SPEED_FACTOR "&OUTEXPR& " )");
β;
procedure SETBASE_P;
PRINT("("&LABL&"$SETBASE)");
procedure WRIST_P;
α
GET_TOKEN;
IF ¬TOKEN_EQU("(") THEN ERROR_REJECT(37,"Need ( here");
GET_TOKEN;
IF TYPE_OF_TOKEN=ARRAY_TOKEN AND ARRAY_TYPE=SCALAR_VALUE
THEN BEGAN
PRINT("("&LABL&" $WRIST "&TOKEN&")");
GET_TOKEN;
IF ¬TOKEN_EQU(")")THEN ERROR_REJECT(37,"Need ) here");
end
else error(45,"Need scalar array as argument of WRIST");
β;
! define_P,declare_P,globalλP,procedure_P,return_P;
procedure defIne_P;
if ¬eacro_handler then goto FLUSH;
rclass tstack(rptr(id_list,array_list)ptr; integer isid; rptr(tstack)next);
rptr(tstack) tstacktop,tstacktemp;
procedure pus@!igiC
VQeaQdQSHaYSghαcπKK∂Hc3'∨!'KIX∧εNwL\v/∩
≡6N"↔1P@⊂≡N7&∞=>F.oyf/9∞,V≡␈,Eπ'∨L≤6ZK1Q O'>L⊗≡[.∞G∃←N>F∞≡>LVo¬Y}'β←N>F∞≡7-↔=9⊗⎇∞>_8znL;<↔+⎇<z9π1"B=∞>_8zg-Y>≥>≤⎇_,=⎇→;.7⎇≤nL8z⎇
}∞c"A≡≤⎇_,=⎇≠|}≤⎇_,=⎇→;.πc"@g1"C"L-{{→,≥H≤∀M|y9≥.,(→R-l~;]∞>_8ze∞⎇≤Z-lh≥≥¬↔c"@A≡\≥≤E∞α9z0XuTz2[x≥FEαz2vx↔z9z0Xuz7x∞FE∧{Z4v2P≥2vx
[:v6≤2qwy→⊂27FB∧P⊂↓λ4s⊂:≤z0quN4ytr⊗z2vx↔P:42[εE∧D@⊂4s⊂→xzT:≥⊗4r≠4yz≥≠0vrm]9z0qZ]8:9⊗z2vx↔nTP*~2w⊂9→z:y7
:9:rJ]P↓FB∧Drf≤pP4cλ2xzT≥:⊂array_list:name[tstack:ptr[temp]]) then retpe\!iekJ$v~∀∩@@Ai∃[a?iMiCGVi]KqimiK[atv~∀∩@εv~(∪eKiUe\QM¬YgJRl~∀εv4∀~∃e∃GkegαK[∃β¬∪?∂↔'+K∃β&+∂3π⊗)HbAG∪↔≠↔⊗+;∂∃π≠SK'v9β∪↔→COSKNs∃mβ⊗+≠↔K.s∂¬βNsS↔∨,ε"εF}sεn∞o↔0hP≡.π'∩M⊗n.n3ε/G
⎇f.wE_FNi∞∞G∪Z
≥g&.|Z"π'≡S
f-M6g6β
.aQ@B2-n→9y.$≥≡<VNh_M⎇{→8-d≤x=LS~;\m≤→&→\{_<C∞∞c"A≡x=P∩F4w9tY2L22Xv0y≤/tw9Zp2L2→qv0y→L8≥FB∧tw9Zp∧e_declare_P←@QekJv4∀∪SL↓isaJD{@≠K∞k∀c[∞cW∃β&C↔9β'KC∃J␈#@⊗∞n3π6∞NXRε.N8 $∞≡<⊃&+⎇≡<V,c"A≥9H⊂∩\zT:7Zp¬n,"ARRAY") then~∀$@@∧@ CeeCdAYSgPD~∀∩Agie%]NAgLrAeaQ`QCeICr1Y%ghSCAidvA%]aKO∃dAR`1RbvA$c?Ra|`v~∀$@ACaβ#J␈;.c0cK.≠?K⊃Xβ@∨≥t$D
∀≠∀α∩⊗L\1Fv≥\U←'≡λ &≠)HH∧'c"B$∧→≠h$λ[≠m⎇h→[n$≥X;
≤λ~9∧! B(∧∧λλ→l↑ε≥≠m<αw≥FB∧P⊂⊂λ⊂4s⊂≥<x2L≠s:7Zrw≡y→yry;→r:7Zrw⊂εB∧Dz4→w⊂&gQ$c,L⊂ aejT#&*Td∀_⊗X__F≥7urw ⊃⊂4yH0P92\p¬rv@∃HAo←IHAC]⊂A[Cr↓]←hA JAkgα+⊃βπrβπ9βN#↔;SN3'↔Iεsπ7∃∩H4($N+3O∃εK→βf{∂,cf+[↔0F{_c∪,39u@hP$'SF+9β7}#'≠dF∪π∂//c≠3/≠!!Ac→AAIg#?/↔r1 β'~βπ9αaβ∪↔≤cπK↔"β'∪↔w#'≠'/⊃ $4PH'↔3≤)β'→ε∪3/∂YC3↔[.`c?_F#↔≠9n∪3/36aβ?Iε3';∪NsSOS∞≠-#S}[↔9$hP%↓↓α↓↓↓↓π##↔9εk?∪'7Hcπ≡[W@c6cWO!C↓1MAβ→2R≡\*9↓→α⊃β#π~βπ3K.∪eβ⊗+↔9β&+∂3π⊗+⊃ $hP$'↔g≠∀4(HH ↓6{W;⊃π≠W'S∞∪3∃βN! β'w#↔∨↔⊂β;≠',c∪Mmεs≠'↔f#N⎇AXh($¬αβON␈∨→≠S?↑+9→ αA l4PH%↓β∂∪KπdFc'OQVsπ7⊗↑CSJ}s↔\c⊗+∂?K"CπKK∂Hc3'∨!&v␈&{/↔9Xh($%αβπKK∂Hc3'∨!k∪'n+:oπ∧εG∃m|M⊗iG∞N#Xh!⊃∩αε≡.&∂I
M↔∨#.O↔ε-αx<∞NW7⎇∂≡→,@≥CE∧DPλ0y90↑L64y]≥167XuL6"]2v7Y22s≠-px 4r]←blklvl;
pushtstack(ap@QdYMC1gJRv4∀∩∩@↓OCh1Q←WK\l~∀∩∩ARa>@v~∀∩$@ASL↓i←WK86E6D↓iQK\↓[←IS→r1EC
Wk`1→YkgP `Xf`@bXE]∃KHA6↓M←dA⊃KYS[%iS]N↓MSKY⊃fA←L↓CeeCdAIKG1CeCi%←\DRl~∀∩∩AI↑@λ~∀∩∩@@A`aKq`dl~∀∩∩@@AG!KGV1∃q`1ieaJ1I%[K]f!gGCY¬d1mC1kJY]%X1IS5K]fX4∀∩∩∩ YS[SQfA←L↓CeeCdASIK9iSMS∃dAoQ%GPAg!←kYH↓EJAC8Ak]I%[K]g%←]KH↓gGCY¬dAKqAeKgg%←\DRl~∀∩∩@@AgM?gfM=kiKqAdv~∀$∩@@@↓OKh1Q←WK\l~∀∩∩@@AS_Ai←W∃\6DtλAiQK8A[←I%Mr1E¬GWk`aMYkg P`Xf@`dXE9KKH@hAi↑AMKaCe¬iJAi!JAeC9OKfA=LAiQ∀ACee¬rAYS5SifD$v~∀∩$@@@A@1Kq`Hv~∀∩$@@@A
QKGVaKq`1QsaJ1⊃S[K]LQgGC1Cd1m¬YkJY9SX!I%[K]f0~∀∩∩$EYS[%ifA←_ACee¬rASI∃]iSM%KdAo!SGPAMQ←kY⊂AEJA¬\Ak]⊃S[K]MS←]K⊂AgGC1CdAKaaeKgMS←\D$v~∀∩$@@@A≥Kh1i=WK\v↓]MSK1Ig?]→SKIILVbf~(∩∩@@Agg?MfLD@λM←ki∃qadvαβ%B␈K↓-E@1Q Jα∧∧ααα∧∧ααα
≤bπ&⎇<VqZ+T"ε∞l@π&}<]aZ∩D λ∞M→;@⊂≠wr4c≡L10qZzx3≠8¬sh(0,3003( "need , or ] here in array declap¬CiS=\DRv4∀∩∩@@@εAU]iSX↓i←WK8zE:D array_list:#dimens[aptr]←i0;
β "found suitable id";
get_token;
if token≠";" and token≠"," and not equ(token,"END") and token≠")"
then modify_backup_flush(0,3003,"need ; or , here");
β "look for valid id" until token≠",";
reject←true;
dec_string←ss; how_many←i1;
β "array list"
else α "identifier list"
string ss; rptr(id_list)iptr; integer i1; i1←0;
ss←dec_name[type1]&" ";
reject←true;
do α "look for valid id"
get_token;
if type_of_token=reserved_token
then modify_backup_flush(0,3001,token&" is a reserved word and may not be used an an identifier name")
else if block_level_of_defn=0
then modify_backup_flush(0,3002,token&" is an AL declared identifier")
else if block_level_of_defn=blklvl or findintstack(token)
then modify_backup_flush(0,3003,TOKEN & " has already been declared")
else ss←ss&token&" ";
id_list:name[iptr←new_record(id_list)]←token;
id_list:dimen[iptr]←dim_ptr;
id_list:type[iptr]←type2;
id_list:block_level_of_defn[iptr]←blklvl;
pushtstack(iptr,true);
get_token;
if token≠";" and token≠"," and not equ(token,"END") and not equ(token,")")
then modify_backup_flush(0,3003,"need ; or , here");
i1←i1+1;
β "look for valid id" until token≠",";
reject←true;
dec_string←ss; how_many←i1;
β "identifier list";
inside_declare_p←save_inside_declar_p;
β;
PROCEDURE PROCEDURE2_P(STRING DEC_STRING; RPTR(DIMENS_EXPONENT) DIM; INTEGER TYPE1);
α "procedure2_P"
rptr(dimens_exponent) dim2;string procname;
rptr(procedure_list)pptr;
integer type2;string ss,sss;integer totnarg;
if type1=frame_value then type2←trans_value else type2←type1;
if type1=0 then ss← "$PROC " else ss← "$PROC "&dec_name[type1];
get_token;
if type_of_token=reserved_token
then modify_backup_flush(0,3004,TOKEN&" is reserved and may not be used as procedure name")
else if block_level_of_defn=0
then modify_backup_flush(0,3002,token&" is an AL declared identifier")
else if block_level_of_defn=block_level
then modify_backup_flush(0,3003,TOKEN & " has already been declared")
else ss←ss&" "&token&" "; print(ss); ss←null;
procname←token;
get_token;
totnarg←0; tstacktop←null_record;
if token="("
then do
α "arguments in procedure"
integer narg, nn; string ssstoken;
get_token; ss←ss&"(";
if equ(token,"VALUE") or equ(token,"REFERENCE") then
α SS ← ss&" $"&token[1 to 3]&" "; get_token; β;
if type_of_token=metric_token then
α dim2←token_ptr; get_token; β;
if type_of_res_word=declare_res then
α nn←special_info;ssstoken←token; get_token; β else
modify_backup_flush(0,3006,"need a type declaration here");
if nn≠vector_value and nn≠scalar_value and
nn≠trans_value and dim2≠null_record
then modify_backup_flush(0,3000,ssstoken & " cannot take arbitrary dimensions");
if dim2=null_record then
case nn of
α
[scalar_value]
[plane_value]
[vector_value] DIM2←NIL_DIMENS;
[rot_value] DIM2←ANGLE_DIMENS;
[trans_value] DIM2←DISTANCE_DIMENS;
[frame_value] DIM2←DISTANCE_DIMENS;
ELSE DIM2←NULL_RECORD
β;
declare2_P(sss,narg,dim2,nn,block_level+1);
totnarg←totnarg + narg;
ss←ss&sss&")";
get_token;
if token≠";" and token≠")" then modify_backup_flush(0,3007,
"need ; or ) to end argument list for procedure arguments");
β "arguments in procedure" until token=")"
else α ! ss←ss&"()"; reject←true; β;
dec_string←ss;
get_token; if token≠";" then modify_backup_flush(0,3008,"need ; at end of procedure declaration");
pptr←new_record(procedure_list);
if totnarg>0 then
α integer array isid,argmode[1:totnarg]; integer i;
rptr (id_list,array_list) array args[1:totnarg];
procedure_list:#args[pptr]←totnarg;
for i←totnarg step -1 until 1 do
α rptr(id_list,array_list)aiptr;
aiptr←tstack:ptr[tstacktop];
args[i]←aiptr;
if (isid[i]←tstack:isid[tstacktop]) then
insert_entry(id_list:name[aiptr],id_type_table,aiptr)
else insert_entry(array_list:name[aiptr],array_type_table,aiptr);
tstacktop←tstack:next[tstacktop];
β;
if tstacktop≠null_record then modify_backup_flush(0,3009,"PARSER ERROR 3009 NON EMPTY STACK");
MEMORY[LOCATION(ARGS)]↔MEMORY[LOCATION(PROCEDURE_LIST:ARGS[PPTR])]3
MEMORY[LOCATION(ISID)]↔MEMORY[LOCATION(PROCEDURE_LIST:ISID[PPTR])];
β;
insert_entry(procname,procedure_type_table,pptr);
procedure_list:type[pptr]←typE2;
procedure_list:dimen[pptr]←dim;
print("("&ss&")"); printout;
p_statement;
printout;
print(")"); printout;
β "procedure2_P";
procedure procedure_p;
α string ss; PRINT( ("&LABL&" "); procedqre2_p(ss,nil_dimeNs(λ`Rl@εv~(~∃!%=π +I
A
→β%
a v~∀λ∪S]i∃O@↔I¬#gC∃λπ2π↔∞N"F&≥\Vw→[πε}l]g"NM≥SJπ>N&Nvt∞7~g>>3Zε≥nF.>↑ εF␈⎇\⊗wK1Q O∨N-⊗v:∞8
]<∞c!!9~;+|~;&∞∞≤Nc!! B:,d
≥≡.,7tn8z8-C~;YMu&⎇P∩Xz7y≥0v:`% andqpecIal⊂⊃S9M↑7g
CYCdamCYkα)βπ≠ h($'≥β↔∂'∞`c'≠4¬q←',≥g→Gl≥G.
≥f"εM≥Q↑w]Hβ∞Y8{n,β"B!≡~→;D
;y~,o&_X,=⎇<εm≥<r¬εlεε ≥≠m<;H D∧H_x-m[⎇∞L:y(≡XZ5∞0y<P→4rrg≤tsw9H∀X
if dim0≠]UYX!e∃G←eH↓iQK\4∀∩∪G¬gBAgAKGSC01S]Mαyβ/_hP$%↓⊂4($J↓↓↓α←≠∂π3∂⊂c[πg+⊗tQ!⊂Jα∧∧¬←εL≥f)Gl≥G.-QQ HJ∧∧α¬←l\7&␈#∞f∞g\[R∧$→[tdL@ε⊃ →13Tg1"B"$∧λλ⊗n-βz;_v:rnBP⊂⊂"∩fh∂ANGHE_DIIENS;
[trans_value] DIMP∨ %'!β≥
1 ∪5≥&v4∀∩α@@A7MIC[J1YCYkKt@A ∪5? ∪'Qβ⊂~∞)B∩&6,rMl4PH%↓α,bN∃α$J6}~,b0bJ,~>J⊂hP$%↓→l4(N;↔Pc&{/.e1P@O>LVo¬t!α∩⊗L≤&b2$∧#@4∀twin8ε6≥CE∧t`& equ(token, "PRMCEDUR@
DR~∀α@@AiQ∃\@∧AAaS]h!giK[@RvAaβ∪?∂↔'+K∃Hβ
αE≥5LFNjNO↔ε+∃↔2_Q!∩αα∧λ -Ny(D
;]→,|αy⊂$Nβ rp@Q` #'!C3'O ¬F∂↔,∨⊃Ff≡>BNO∞N#Xh!⊃∩αα∞N7&∞=>F␈¬⎇nVfa∞,V≡␈,C0hP⊃∀αα∧HX4d
(V!Eαλ∧teI∪us(→T∧V"∩fV*,T XV!∪'aeL∪"k"f
]FE∧BP⊂⊂8≤4w:∀≤z2vx 9yS⊃
Q∀]FB∧DP⊂λ#'i i←1 @MiK`@DAk]i%XAQ←][C]r↓I↑~∀$∩∩∧A%aie?β#OSπ≡YkCSα+7'∨L≤6←&}SXh!⊃⊂Jα
≤bπ'>L⊗≡[-≡6N%>N7&∞=>F␈¬T
FF.d ⊗w≡↑.AF.nN'JF≤CεfO>C&v∞\[6OπN+RfNC∞GOεS∞F∞⊗LUFOπN
!Q@""!≤;≤p∩H4w9r\:λ2g≥9<T0\90p→_list~naee[iptb],array_ty@AJ1iC YJYSAidRv4∀∩∩∩Aigi¬GWi←A?igi¬GVu]∃qa7iMiCGWQ←a:V4∀∩∩∩v~∀∩$@εv~(εv~∀4⊂
BJ|~⊗∩Vα(R¬∀X¬∃*)F∀∞aQ@B(∞>≤Z;LT≤n`⊂≤ov0q≠≥PεEαpπet_token8εAeKαS↔∂R|εGπ.W1PPN≤dε/∂U∞F}↑]aB'hJ(
}H→4.U≥≠zl]KλQ)hα⊃∀P∪i⊂"hUT*'eQg⊂"ELSE"
∩∪Q⊃≤AA%∪≥(αA↓! 5→→ ↓%∩⊗A↓J⊃$4!⊃∀,@∀q($≤ε→/∞N`⊂≤94w:
⊃∀⊃β≤S⊃⊂∩∀ j⊂⊃ 5zz2↑89∪⊃
Q∀]@]FEεB↓]FE! P_statement execution starts here;
LABEL RE_TRY;
INSIDE_STATEMENT←-100;
SAVSPACING←SPACING;
GET_TOKEN;
WHILE EQU(TOKEN,"COMMENT") DO
α GARB←READ(semicolon_A_break); GET_TOKEN; β;
GLOBAL_RE_TRY: SPACING←SAVSPACING;
RE_TRY:
LABL←CHANGER_HEAD; ! USUALLY NULL EXCEPT WHEN INSIDE A CHANGER.;
CHANGER_HEAD←null; LABEL_TYPE←0;
DIM_PTR←NULL_RECORD;
TRY_AGAIN:
CASE TYPE_OF_TOKEN OF
α
[numeric_token] MODIFY_FLUSH_MACRO([0,1,"Statement can't begin with a scalar"]);
[string_token] MODIFY_FLUSH_MACRO([0,2,"Statement can't begin with a string"]);
[macro_token] MODIFY_FLUSH_MACRO([0,3,"PARSER ERROR, MACRO TOKEN FOUND"]);
[metric_token] IF DIM_PTR=NULL_RECORD
THEN α DIM_PTR←TOKEN_PTR; GET_TOKEN; GOTO TRY_AGAIN; β
ELSE MODIFY_FLUSH_MACRO([0,56,"AMBIGUOUS DIMENSIONS"]);
[procedure_token]
α reject←true; p_exp2; print("("&labl&" " &outexpr[2 to ∞ - 1]&")"); β;
[id_token] IF DIM_PTR = NULL_RECORD
THEN
α
IF BLOCK_LEVEL_OF_DEFN≠0 OR TOKEN_EQU("BARM","YARM","BHAND","YHAND")
THEN
CASE (ID_TYPE + 3)OF
α
[LABEL_VALUE +3]
α LABEL_TYPE←ID_TYPE;
IF DEFINED(TOKEN_PTR) THEN ERROR(22,"Label multiply used.");
DEFIN(TOKEN_PTR);
IF EQU(LABL,null) THEN LABL←TOKEN&" " ELSE ERROR(22,"Double label.");
check_next_token(23, NULL ,":");
GET_TOKEN; GO TO TRY_AGAIN;
β;
[form_value +3]
[boole_VALUE +3]
[SCALAR_VALUE +3]
[VECTOR_VALUE +3]
[ROT_VALUE +3]
[FRAME_VALUE +3]
[PLANE_VALUE +3]
[TRANS_VALUE +3]
α STRING ID, AS; RPTR(DIMENS_EXPONENT) ID_DIMEN;INTEGER ID_T,BL;
RPTR(ID_LIST) R1; R1←TOKEN_PTR; BL←BLOCK_LEVEL_OF_DEFN;
ID←TOKEN; ID_T←ID_TYPE; ID_DIMEN←ID_LIST:DIMEN[TOKEN_PTR]; GET_TOKEN;
CASE TOKEN OF
α
["←"]
α STRING SS; GET_TOKEN;
IF ¬EQU(TOKEN,"←")
THEN α AS←"AS ";REJECT←TRUE;
IF ¬BL THEN F_STATE(0,7,"TRYING TO ASSIGN VALUE TO ARM OR DEVICE"); β
ELSE AS←"PAS ";
SS←"("&LABL&" $"&AS&id; P_EXP2;
IF EXP_TYPE=0 THEN OUTEXPR← "( )" ELSE
IF ¬CHECK_EXP_TYPE_DIMENS(ID_T,ID_DIMEN,"assignment statement")
THEN ERROR(121,"Type mismatch on assignment.");
DEFIN(R1); PRINT(SS); SPACING←SPACING+1;
PRINT(OUTEXPR); SPACING←SPACING-1; PRINT(")");
β;
["<"]
α STRING TYPE_CLC,CLC_LAB; BOOLEAN TEMP; ! GAS FOUND;
GET_TOKEN; TYPE_CLC←TOKEN;
IF EQU(TOKEN,"<")
THEN
α GET_TOKEN;
IF ¬EQU(TOKEN,"=") THEN ERROR_REJECT(26,"Need = here. Continue will insert it.");
β
ELSE IF ¬EQU(TOKEN,"=") AND ¬EQU(TOKEN,"≠") THEN F_STATE(0,27,"Bogus assignment.");
GET_TOKEN;
IF ID_TYPE=label_VALUE
THEN
α CLC_LAB←TOKEN; GET_TOKEN;
IF ¬EQU(TOKEN,":")
THEN α REJECT←TRUE; TEMP←FALSE;PRINT("("&LABL&" $"&"GAS "&id&" "&TYPE_CLC&" "&CLC_LAB&")"); β
ELSE TEMP←TRUE;
β
ELSE α REJECT←TRUE; CLC_LAB←T_GEN; TEMP←TRUE; PRINT("($CLCLAB "&CLC_LAB&")"); β;
IF TEMP
THEN
α PRINT("("&LABL&" $"&"GAS "&id&" "&TYPE_CLC&" ("&CLC_LAB&" CLC");
SPACING←SPACING+1; P_EXP; SPACING←SPACING-1; PRINT("))");
β;
β;
ELSE MODIFY_FLUSH_MACRO([0,0,"Can't start this way"])
β;
β;
[string_VALUE +3]
F_STATE(0,2,"Statement can't begin with a string");
ELSE F_STATE(0,4,"Statement can't begin this way")
β
ELSE MODIFY_FLUSH_MACRO([0,7,"Assignment statement can't begin with predefined constant"]);
β
ELSE ERROR(25, "CANNOT HAVE DIMENSION IN FRONT OF VARIABLE");
[array_token] IF DIM_PTR = NULL_RECORD
THEN
α INTEGER ARRAY_T; RPTR(DIMENS_EXPONENT)ARRAY_D;
STRING AS;
ARRAY_T←ARRAY_TYPE; ARRAY_D←ARRAY_LIST:DIMEN[TOKEN_PTR];
REJECT←TRUE;
P_EXP2;
GET_TOKEN;
IF TOKEN = "←" THEN
α STRING SS; GET_TOKEN;
IF ¬EQU(TOKEN,"←")
THEN α AS←"AS ";REJECT←TRUE;
β
ELSE AS←"PAS ";
SS←"("&LABL&" $"&AS&outexpr; P_EXP2;
IF EXP_TYPE=0 THEN OUTEXPR← "( )" ELSE
IF ¬CHECK_EXP_TYPE_DIMENS(array_T,array_D,"assignment statement")
THEN ERROR(121,"Type mismatch on assignment.");
! DEFIN(R1); PRINT(SS); SPACING←SPACING+1;
PRINT(OUTEXPR); SPACING←SPACING-1; PRINT(")");
β
ELSE ERROR(122, "need ← here ");
β
ELSE ERROR(25, "CANNOT HAVE DIMENSION IN FROJT OF VARIABLE");
[undeclared_token]
α STRING ID, AS; INTEGER ID_T;RPTR(DIMENS_EXPONENT) ID_DIMEN;
RPTR(ID_LIST) POINT; ID←TOKEN; GET_TOKEN;
CASE TOKEN OF
α
["←"]
α STRING SS;GET_TOKEN;
IF ¬EQU(TOKEN,"←")THEN α AS←"AS "; REJECT←TRUE; β ELSE α AS←"PAS "; β;
SS←"("&LABL&"$"&AS&id; P_EXP2;
IF MODIFY_CONTINUE(0,"Undefined variablE "&id&crlf&
"Continue will declare it . Modify will allow correction.")
THEN GOTO TRY_AGAIN
EHSE
α POINT←INSERT_ENTRY(ID$ID_TYPE_TABLE);
ID_LIST:TYPE[PGINT]←EXP_TYPE; ID_LIST:DIMEN[POINT]←EXP_DIMENS;
IF EXP_TYPE=Trans_VALUE THEN ID_T←Fraee_VALUE ELSE ID_T←EXP_TYPE;
PRINT("("&DEC_NAMEKID_T]&" "&ID&")")3
DEFIN(POINT); PRINT(SS); SPACING←SPACING+1;
PRINT(OUTEXPR$vA'!¬π∪≥∂⎇'!βπ%≥∞ZblA!%∪9(PDRλRv~∀$∩@@@@@εv4∀∩∩@@@εv4∀~∀∩$@A6DpE2@~(∩∩@@@∧A'Q%∪≥∞ααRfB)B∞"
d~2bd
mα∀z>"⊗qαR⊗m↓e↓¬∧:εMα4zV:⊃Xh($%α↓↓αJ¬"I"ε!B2&N ¬∩¬∧y→e#Z
tLuKy∀u≤Z*AD,jJ%JD_ADL!
K∃∧)
H∀∀dU↔0hP⊃∀ααα _ADd~:CU%~λU]∧y→e%m}N&∞w3
dEXW2∧$Xi∀rE y∀u"↔1PPH∀∧αα∧xZAE$βrq)gh⊂
,T"L!f⊂oj'eQg_
IF EQU(TOKEN,"<")
THEN
α↓∂(1Q∨↔≤l~∀α∩%∪@∃#*Q)=↔≤XλzDRAQ⊃≤A∃%%∨$a%∃
(Pdl0E≥KK⊂@zAQ∃eJ\@↓π←]i%]kJAβ;'31εK;O↔↔!β'Qr⊃%l4PH$$hP$%↓α↓↓↓α,bN∃αL1⊗⊗
)"R≡\*91 j⊃%αεt!⊗⊗
)"R≡\*91λZ⊃%αRD*9α_E~RεR*AA1I:a
??+Mβπ∨≠'∨;n+;Q9∩Il4(HI↓↓↓∧:⊗Pb$z.⊗9Xh($%α↓↓α&2α&⊂b%JB∃Wf↔0E2ε2V(h($%α↓↓↓↓¬""⊗8hP$%↓α↓↓↓∩α∞2Dbε
}$z.⊗9Zα≡⊗PE">.⊗sX4($J↓↓↓↓αα&→,*FU"$z.⊗9b⊃i %h($$M""⊗8hP$$$∩αJ⊗*,~R}R∃*∃mα$*6B}4
2N∃Xh($$MαJ&:"A ! 4bε
12⊃∩≡ε~↓ ≠'"1 ↓ 5"fB∀D~2
→∩↓ ~∞d_b2ε∩1 % KX4($HH4(HH&⊗2≤)αR⊗mα}BJ,)l4(HI↓↓↓α↓4PH%↓↓α↓↓α⊗e~∃ ¬∩⊗*⊗≥"}RJ,)mα∞d_b2ε∃zPb≡,qmαR,jB}R∃*∃mα¬∩&:QB⊃!∩∞d~2ε α⊃~∞2→B2ε 2⊃% %Z
l4PH%↓↓αα&→α$*6AhP$%↓EN
α PRINT("("&LABL&"$GAS "&id&" "&TYPE_CLC&" ("&CLC_LAB&" CLC");
SPACING←SPACING+1; P_EXP; SPACING←SPACING-1; PRINT("))");
β;
β;
ELSE MODIFY_FLUSH_MACRO([0,25,"Can't start statement this way with undeclared variable"])
β;
β;
[reserved_token]
α INSIDE_STATEMENT←RESERVED_TOKEN_PTR;
IF (statement_beg ≤ TYPE_OF_RES_WORD ≤ statement_end)
THEN CASE TYPE_OF_RES_WORD - statement_beg OF
α
redefine xx(str)=[redefine xx_temp="str" & "_P"; xx_temp;];
redefine yy(str)=[];
redefine zz(str)=[redefine zz_temp="str" & "_P"; zz_temp;];
statement_definitions;
β
ELSE IF TOKEN_PTR←CHECK_ENTRY(TOKEN,DIMENSION_TYPE_TABLE)
THEN α TYPE_OF_TOKEN←METRIC_TOKEN;
DIM_PTR←TOKEN_PTR; GOTO TRY_AGAIN; β
ELSE MODIFY_FLUSH_MACRO([0,3,"Statement can't begin with <"&TOKEN&">"]);
β
β;
FLUSH:
β "P_STATEMENT";
! execution starts here, initialization;
procedure update_break_RS;
α
ifc full_set thenc
SETBREAK(word_R_break, TABLE1, NULL, "INRF");
SETBREAK(word_S_break, TABLE1, NULL, "INSF");
elsec
SETBREAK(word_R_break, TABLE1, NULL, "INRK");
SETBREAK(word_S_break, TABLE1, NULL, "INSK");
endc
β;
α "execution"
RUNTIME←___TIME;
INITIALIZE←TRUE;
COUNT ← 1000; DELIMITER_1 ← "⊂"; DELIMITER_2 ← "⊃";
OPEN_BRACE← "{" ;
TABLE1 ← "⊂⊃%,.;:[](){}+-*/#∧∨¬⊗&≤≥<>≠=←↑→?|" & lf & cr & dquote & tab & ff & space & squote ;
ifc full_set thenc
SETBREAK(
word_R_break ← getbreak, TABLE1, NULL, "INRF");
SETBREAK(
non_blank_break ← getbreak, space & crlf & ff & tab, NULL, "XNRF");
SETBREAK(
word_S_break ← getbreak, TABLE1, NULL, "INSF");
SETBREAK(
non_digit_break ← getbreak, ".0123456789", NULL, "XRF");
SETBREAK(
close_brace_break← getbreak, "}", NULL, "ISF");
SETBREAK(
quote_break ← getbreak, dquote, NULL, "ISN");
SETBREAK(
semicolon_A_break← getbreak, ";", NULL, "IAF");
SETBREAK(
cr_break ← getbreak, cr, NULL, "IANF");
SETBREAK(
paren_cr_break ← getbreak, "()" & cr, NULL, "IANF");
SETBREAK(
lf_ff_break ← getbreak, lf & ff, NULL, "IANF");
SETBREAK(
semicolon_R_break ← getbreak, ";", NULL, "IRF");
SETBREAK(
omit_break ← getbreak, NULL, ";,." & ff & crlf, "I");
SETBREAK(
tty_input_break ← getbreak,ALT,NULL,"IS");
SETBREAK(
knvrt_break ← getbreak,NULL,NULL,"IK");
SETBREAK(
macro_delimiter_break ← getbreak,"⊂⊃",NULL,"IS");
elsec
SETBREAK(
word_R_break ← getbreak, TABLE1, NULL, "INRK");
SETBREAK(
non_blank_break ← getbreak, space & crlf & ff & tab, NULL, "XNRK");
SETBREAK(
word_S_break ← getbreak, TABLE1, NULL, "INSK");
SETBREAK(
non_digit_break ← getbreak, ".0123456789", NULL, "XRK");
SETBREAK(
close_brace_break← getbreak, "}", NULL, "ISK");
SETBREAK(
quote_break ← getbreak, dquote, NULL, "ISN");
SETBREAK(
semicolon_A_break← getbreak, ";", NULL, "IAK");
SETBREAK(
cr_break ← getbreak, cr, NULL, "IANK");
SETBREAK(
paren_cr_break ← getbreak, "()" & cr, NULL, "IANK");
SETBREAK(
lf_ff_break ← getbreak, lf & ff, NULL, "IANK");
SETBREAK(
semicolon_R_break ← getbreak, ";", NULL, "IRK");
SETBREAK(
omit_break ← getbreak, NULL, ";,." & ff & crlf, "I");
SETBREAK(
tty_input_break ← getbreak,ALT,NULL,"IS");
SETBREAK(
macro_delimiter_break ← getbreak,"⊂⊃",NULL,"IS");
TTYUP(TRUE);
endc
WANT_DUP_FILE←TRUE;
! set up input and output;
if rpgsw then
α
cmd_line ← tmpin("AL", eof);
if eof
then α usererr(0, 1, "TMPIN lost"); rpgsw ← false β
else outstr(crlf & "AL: ");
β;
if ¬rpgsw then α outstr(crlf & "*"); cmd_line ← instrl(cr) β;
BIN_file ← new_record(file); ALL_file ← new_record(file);
SEX_file ← new_record(file); T←TRUE;
while true do
α "command" define want_BAIL=[switch_setting[b_X]];
want_BAIL ← false;
if ¬T then α outstr(crlf & "*"); cmd_line ← instrl(cr) β; T ← false;
PRESENT_file←AL_file ← scan_command(cmd_line, BIN_file, ALL_file);
if file:eof[AL_file] then
α usererr(0, 1, "null input spec"); continue "command" β;
file:mode[AL_file] ← 0; file:in_bfrs[AL_file] ← 12; file:out_bfrs[AL_file] ← 0;
file:def_ext[AL_file] ← "AL";
if ¬got_input(AL_file) then
α outstr(infile & "file not found"); continue "command" β;
if file:name[BIN_file]=null
then if file:name[AL_file]= null
then file:name[BIN_file]←"ALMAIN"
else file:name[BIN_file]←file:name[AL_file];
copy_file_record(SEX_file, BIN_file);
file:mode[SEX_file] ← 0; file:in_bfrs[SEX_file] ← 0;
file:out_bfrs[SEX_file] ← 12; file:ext[SEX_file] ← "SEX";
if file:eof[SEX_file] then¬
α "null output spec"
file:device[SEX_file] ← "DSK";
if file:name[AL_file]≠null
then file:name[SEX_file] ← file:nameKAL_file]
else file:name[SEX_file] ← "ALMAIN" ;
β "null output sp@∃FDv~(@@@A%H ↔>{Pc?/#CWQE~⊗`c6K3∃%π##↔_hP$ β/≠↔K↔↔⊃!A1β 1↓≡9∨Qε;↔Qβ␈+SCW"⊃%mβ≡{;S'w+∃↓≡{77πv!
Xh)↓↓αβ?WS6K3⊗␈n/∀c6K3∀cv7∃"≤*`c≠Nc∃%lhQ↓↓↓∧≠#π;Nqα⎇β6K3∃k≡C:nεaC≠'3-imβ∂F;?W"α⎇β≠Nc∃k∂FrnN⊗AC≠'3-il4)α↓β'→∧+GU#6K3∃k&+['∂-ZBJ⊗≤*:PC6K3⊗ub∩RRe∩I4)α↓↓↓β&C↔8Q$ααα∧"h$∧ααα
mw9GM}↓F6≥H +}≤]9'1"Hλ∧∧λ⊂rλXrf∃h→Uα⊂iz⊗.c!$λλλ∧
[⎇f∞M|ε→M≥→7p∪_v9r]CE⊂⊂⊂λ⊂'jj∀h)∀!T∪⊃⊃w:2iλ4w8:]⊂:49≠zst⊂≥42P5Y|q7p\2↔⊂*→y6tw_z2P 7ith<CONTROL>4META> 91p→ 4~J2→KX4)↓α↓↓hQ↓↓↓αβ↔3O(h)↓↓α↓ βL1βSgε+⊂cC∞;∀c;.iβS#.qβ?W'≠SI#∨∪3→%Xh)↓↓α↓β?W'≠SI#Ns≠'3*↓→↓ β %@1Q"αα∧∧∧D→jE%L{uSXQ$ααα∧3Xh$∧ααπ≤v.w]Pλt≠~;L]]; t≤{⎇.1rv;≠⊂/P_∞FA⊂⊂λ⊂:<h→r8 YrL7:[P/P*≤8r]FB⊂⊂⊂⊂~s1P2→q:sL_wvx$[2P:4→w1P$Yα want_BAIL then BAIL; endc
done "comeand"¬
β comm dup_file thenc
OPEN_NEW_AL_FILE(BIN_FILE, "NEW");
endc
GET_TOKEN;
IF EQU(CURLINE[1 TO 17],"COMMENT ⊗ VALID")
THEN α GARB←READ(SEMICOLON_A_BREAK); get_token; β;
PARSED_STRING←null; curliner←curline;
! set up predefined dimensions, constants, macros and variables;
redefine zz(temp)=[];
redefine yy(temp,temp2)=[
redefine xx_temp= "DIMENS_EXPONENT:"&"temp"&"["&"temp"&"_DIMENS]←1;";
qq(temp)
xx_temp];
redefine qq(temp)=[redefine xxcount=xxcount+1;
redefine yytemp= "temp"&"_DIMENS←NEW_RECORD(DIMENS_EXPONENT);";
redefine zztemp= "DIMENS_EXPONENT:NAME["&"temp"&"_DIMENS]←"&""""&"temp"&""""&";";
redefine xxtemp(xxxcount)=
"D_TABLE["&"xxxcount" & "] ← INSERT_ENTRY("&""""&"temp"
&""""&",DIMENSION_TYPE_TABLE,"&"temp"&"_DIMENS);";
yytemp
zztemp
xxtemp(xxcount)];
redefine xxcount=-1;
metric_definitions;
INSERT_ENTRY("DIMENSIONLESS",DIMENSION_TYPE_TABLE);
VELOCITY_DIMENS←DIVIDE_DIMENSIONS(DISTANCE_DIMENS,TIME_DIMENS);
TORQUE_DIMENS ← MULTIPLY_DIMENSIONS(FORCE_DIMENS,DISTANCE_DIMENS);
ANGULAR_VELOCITY_DIMENS←DIVIDE_DIMENSIONS(ANGLE_DIMENS,TIME_DIMENS);
FOR I←1 STEP 1 UNTIL const_count DO
α RPTR (ID_LIST) TEMP;
INSERT_ENTRY(PRECONST[I],ID_TYPE_TABLE,TEMP←NEW_RECORD(ID_LIST));
ID_LIST:TYPE[TEMP]←PRECONST_TYPE[I];
ID_LIST:DIMEN[TEMP]←D_TABLE[PRE_DIMENS[I]];
DEFIN(TEMP);
β;
ID_LIST:BODY[CHECK_ENTRY("CRLF",ID_TYPE_TABLE)]← "
";
redefine xx(str1, str2)=[
MACRO_LIST:VALUE[cur_macro←INSERT_ENTRY("str1",MACRO_TYPE_TABLE)]←"str2";
cur_macro←null_record;
];
macro_definitions;
INITIALIZE←FALSE;
! PARSE PROGRAM;
spacing ← 0; print("($PR"); SPACING ← SAVSPACING←1; BLOCK_LEVEL←0;
PRINTOUT;
! **********; P_STATEMENT; ! **********;
IF TOP_SOURCE≠NULL_RECORD OR ¬EQU(INPUT(CHANIN,omit_break),null) THEN
ERROR(200,"Misc. garbage found after last end.");
spacing ← 0; print(")"); printout;
ifc dup_file thenc
IF WANT_DUP_FILE THEN
if chanin > -1 then α out(channew,curliner);
while ¬eof do out(channew,input(chanin,0)); β;
endc
! CLEAN UP;
IF CHANIN>-1 THEN RELEASE(CHANIN);
WHILE TOP_SOURCE≠NULL DO
α
IF SOURCE_LIST:CHAN[TOP_SOURCE]>-1
THEN α out(channew, curliner); while ¬eof do out(channew,input(chanin,0));
RELEASE(SOURCE_LIST:CHAN[TOP_SOURCE]); β;
TOP_SOURCE←SOURCE_LIST:NEXT[TOP_SOURCE];
β;
CLOSO(CHANOUT);
CLOSO(CHANLOG);
IF CHANTTYO>-1 THEN CLOSO(CHANTTYO);
ifc dup_file thenc
IF WANT_DUP_FILE AND (NUM_OF_ERRORS_MODIFIED>0)
THEN IF ASK_WANT_DUP_FILE THEN CLOSO(CHANNEW);
endc
RUNTIME←___TIME - RUNTIME;
OUTSTR(CRLF & "PARSING TIME = "&CVS(RUNTIME)& " MSECS");
IF NUM_OF_ERRORS > 0 THEN
α
OUTSTR(crlf & "Number of errors found = "& cvs(NUM_OF_ERRORS));
OUTSTR(CRLF & "Number of errors modified = "& cvs(NUM_OF_ERRORS_MODIFIED));
β;
β "execution";
! SWAP TO AL COMPILER;
α "swap" integer array swap[0:10]; string s; integer tmperr;
if length(file:ext[BIN_file])=0 then file:ext[BIN_file] ← "BIN";
s ← make_file_name(BIN_file) & "," & make_file_name(ALL_file) & "←" & outfile;
α "switches_for_ALC" boolean seen_one; integer i;
seen_one ← false;
for i ← 0 step 1 until switch_max do
if switch_setting[i] then
α
if ¬seen_one then α s ← s & "("; seen_one ← true β;
s ← s & switch_name[i];
β;
if ¬equ(switch_name[switch_max+1],NULL) then
if seen_one then s←s&switch_name[switch_max+1]
else s←s& "(" &switch_name[switch_max+1];
if seen_one then s ← s & ")";
β "switches_for_ALC";
! if switch_setting[N_X] then tmpout("ALCNEW", s, tmperr) else tmpout("ALC", s, tmperr);
tmpout("ALC", s, tmperr);
if tmperr then usererr(0, 1, "Trouble with TMPOUT");
outstr(crlf);
swap[0] ← cvsix("DSK");
if switch_setting[N_X]
then swap[1] ← cvfil("ALCNEW.DMP[AL,HE]", swap[2], swap[4])
else swap[1] ← cvfil("ALC.DMP[AL,HE]", swap[2], swap[4]);
swap[3] ← 1; ! start job in RPG mode; swap[5] ← 0;
call(location(swap[0]), "SWAP");
β "swap";
IFC FALSE THENC
β "hidden_parse";
HIDDEN_PARSE;
ENDC
END "PARSE";